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:
Hugh Guan 2018-04-04 14:21:43 -04:00 committed by Gerrit - the friendly Code Review server
parent 502257f3e6
commit a5cf01f3c5
2 changed files with 30 additions and 24 deletions

View file

@ -529,25 +529,23 @@ static int apr_vm_cb_thread(void *data)
{
uint32_t apr_rx_buf_len;
struct aprv2_vm_ack_rx_pkt_available_t apr_ack;
unsigned long delay = jiffies + (HZ / 2);
int status = 0;
int ret = 0;
while (1) {
apr_rx_buf_len = sizeof(apr_rx_buf);
ret = habmm_socket_recv(hab_handle_rx,
(void *)&apr_rx_buf,
&apr_rx_buf_len,
0xFFFFFFFF,
0);
do {
apr_rx_buf_len = sizeof(apr_rx_buf);
ret = habmm_socket_recv(hab_handle_rx,
(void *)&apr_rx_buf,
&apr_rx_buf_len,
0xFFFFFFFF,
0);
} while (time_before(jiffies, delay) && (ret == -EAGAIN) &&
(apr_rx_buf_len == 0));
if (ret) {
pr_err("%s: habmm_socket_recv failed %d\n",
__func__, ret);
/*
* TODO: depends on the HAB error code,
* may need to implement
* a retry mechanism.
* break if recv failed ?
*/
break;
}

View file

@ -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_map_data *map_data = NULL;
struct msm_audio_smmu_vm_map_cmd smmu_map_cmd;
unsigned long delay = jiffies + (HZ / 2);
rc = ion_handle_get_size(client, handle, len);
if (rc) {
@ -122,12 +123,15 @@ static int msm_audio_ion_smmu_map(struct ion_client *client,
goto err;
}
cmd_rsp_size = sizeof(cmd_rsp);
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
(void *)&cmd_rsp,
&cmd_rsp_size,
0xFFFFFFFF,
0);
do {
cmd_rsp_size = sizeof(cmd_rsp);
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
(void *)&cmd_rsp,
&cmd_rsp_size,
0xFFFFFFFF,
0);
} while (time_before(jiffies, delay) && (rc == -EAGAIN) &&
(cmd_rsp_size == 0));
if (rc) {
pr_err("%s: habmm_socket_recv failed %d\n",
__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_map_data *map_data, *next;
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
@ -205,12 +210,15 @@ static int msm_audio_ion_smmu_unmap(struct ion_client *client,
goto err;
}
cmd_rsp_size = sizeof(cmd_rsp);
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
(void *)&cmd_rsp,
&cmd_rsp_size,
0xFFFFFFFF,
0);
do {
cmd_rsp_size = sizeof(cmd_rsp);
rc = habmm_socket_recv(msm_audio_ion_hab_handle,
(void *)&cmd_rsp,
&cmd_rsp_size,
0xFFFFFFFF,
0);
} while (time_before(jiffies, delay) &&
(rc == -EAGAIN) && (cmd_rsp_size == 0));
if (rc) {
pr_err("%s: habmm_socket_recv failed %d\n",
__func__, rc);