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; 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;
} }

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_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);