audio: qdsp6v2: add retry when EAGAIN for habmm_socket_recv
HAB in the kernel can return -EAGAIN from the habmm_socket_recv() call. This can happen particularly from a signal handler context. Change-Id: Ib2885dc49193efb925ed03dc507a2fd2c97ec8c5 Signed-off-by: King Tam <kingt@codeaurora.org>
This commit is contained in:
parent
502257f3e6
commit
a5cf01f3c5
2 changed files with 30 additions and 24 deletions
|
@ -529,25 +529,23 @@ static int apr_vm_cb_thread(void *data)
|
||||||
{
|
{
|
||||||
uint32_t apr_rx_buf_len;
|
uint32_t apr_rx_buf_len;
|
||||||
struct aprv2_vm_ack_rx_pkt_available_t apr_ack;
|
struct aprv2_vm_ack_rx_pkt_available_t apr_ack;
|
||||||
|
unsigned long delay = jiffies + (HZ / 2);
|
||||||
int status = 0;
|
int status = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
apr_rx_buf_len = sizeof(apr_rx_buf);
|
do {
|
||||||
ret = habmm_socket_recv(hab_handle_rx,
|
apr_rx_buf_len = sizeof(apr_rx_buf);
|
||||||
(void *)&apr_rx_buf,
|
ret = habmm_socket_recv(hab_handle_rx,
|
||||||
&apr_rx_buf_len,
|
(void *)&apr_rx_buf,
|
||||||
0xFFFFFFFF,
|
&apr_rx_buf_len,
|
||||||
0);
|
0xFFFFFFFF,
|
||||||
|
0);
|
||||||
|
} while (time_before(jiffies, delay) && (ret == -EAGAIN) &&
|
||||||
|
(apr_rx_buf_len == 0));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pr_err("%s: habmm_socket_recv failed %d\n",
|
pr_err("%s: habmm_socket_recv failed %d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
/*
|
|
||||||
* TODO: depends on the HAB error code,
|
|
||||||
* may need to implement
|
|
||||||
* a retry mechanism.
|
|
||||||
* break if recv failed ?
|
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,7 @@ static int msm_audio_ion_smmu_map(struct ion_client *client,
|
||||||
struct msm_audio_smmu_vm_map_cmd_rsp cmd_rsp;
|
struct msm_audio_smmu_vm_map_cmd_rsp cmd_rsp;
|
||||||
struct msm_audio_smmu_map_data *map_data = NULL;
|
struct msm_audio_smmu_map_data *map_data = NULL;
|
||||||
struct msm_audio_smmu_vm_map_cmd smmu_map_cmd;
|
struct msm_audio_smmu_vm_map_cmd smmu_map_cmd;
|
||||||
|
unsigned long delay = jiffies + (HZ / 2);
|
||||||
|
|
||||||
rc = ion_handle_get_size(client, handle, len);
|
rc = ion_handle_get_size(client, handle, len);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
@ -122,12 +123,15 @@ static int msm_audio_ion_smmu_map(struct ion_client *client,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_rsp_size = sizeof(cmd_rsp);
|
do {
|
||||||
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
|
cmd_rsp_size = sizeof(cmd_rsp);
|
||||||
(void *)&cmd_rsp,
|
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
|
||||||
&cmd_rsp_size,
|
(void *)&cmd_rsp,
|
||||||
0xFFFFFFFF,
|
&cmd_rsp_size,
|
||||||
0);
|
0xFFFFFFFF,
|
||||||
|
0);
|
||||||
|
} while (time_before(jiffies, delay) && (rc == -EAGAIN) &&
|
||||||
|
(cmd_rsp_size == 0));
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pr_err("%s: habmm_socket_recv failed %d\n",
|
pr_err("%s: habmm_socket_recv failed %d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
|
@ -181,6 +185,7 @@ static int msm_audio_ion_smmu_unmap(struct ion_client *client,
|
||||||
struct msm_audio_smmu_vm_unmap_cmd_rsp cmd_rsp;
|
struct msm_audio_smmu_vm_unmap_cmd_rsp cmd_rsp;
|
||||||
struct msm_audio_smmu_map_data *map_data, *next;
|
struct msm_audio_smmu_map_data *map_data, *next;
|
||||||
struct msm_audio_smmu_vm_unmap_cmd smmu_unmap_cmd;
|
struct msm_audio_smmu_vm_unmap_cmd smmu_unmap_cmd;
|
||||||
|
unsigned long delay = jiffies + (HZ / 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Though list_for_each_entry_safe is delete safe, lock
|
* Though list_for_each_entry_safe is delete safe, lock
|
||||||
|
@ -205,12 +210,15 @@ static int msm_audio_ion_smmu_unmap(struct ion_client *client,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_rsp_size = sizeof(cmd_rsp);
|
do {
|
||||||
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
|
cmd_rsp_size = sizeof(cmd_rsp);
|
||||||
(void *)&cmd_rsp,
|
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
|
||||||
&cmd_rsp_size,
|
(void *)&cmd_rsp,
|
||||||
0xFFFFFFFF,
|
&cmd_rsp_size,
|
||||||
0);
|
0xFFFFFFFF,
|
||||||
|
0);
|
||||||
|
} while (time_before(jiffies, delay) &&
|
||||||
|
(rc == -EAGAIN) && (cmd_rsp_size == 0));
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pr_err("%s: habmm_socket_recv failed %d\n",
|
pr_err("%s: habmm_socket_recv failed %d\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
|
|
Loading…
Add table
Reference in a new issue