From 9e52a2195889f4f03ddfcaefb19c0b42ec1d9070 Mon Sep 17 00:00:00 2001 From: Praveen Chavan <pchavan@codeaurora.org> Date: Fri, 29 Mar 2013 17:28:31 -0700 Subject: [PATCH] qseecom: Fix issue with incomplete command exiting prematurely A process waiting on a signal can be awaken by any signal. We need to only continue processing when the condition of the wait event is met. Change-Id: Ib2102babbb505876f89b04399729e6ff5a475605 Signed-off-by: Mona Hossain <mhossain@codeaurora.org> Signed-off-by: Praveen Chavan <pchavan@codeaurora.org> --- drivers/misc/qseecom.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 613ddd502ad9..a18527cd9973 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -551,6 +551,8 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; struct qseecom_registered_listener_list *ptr_svc = NULL; + sigset_t new_sigset; + sigset_t old_sigset; while (resp->result == QSEOS_RESULT_INCOMPLETE) { @@ -576,17 +578,28 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, } pr_debug("waking up rcv_req_wq and " "waiting for send_resp_wq\n"); - if (wait_event_freezable(qseecom.send_resp_wq, - __qseecom_listener_has_sent_rsp(data))) { - pr_warning("Interrupted: exiting send_cmd loop\n"); - return -ERESTARTSYS; - } + /* initialize the new signal mask with all signals*/ + sigfillset(&new_sigset); + /* block all signals */ + sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset); + + do { + if (!wait_event_freezable(qseecom.send_resp_wq, + __qseecom_listener_has_sent_rsp(data))) + break; + } while (1); + + /* restore signal mask */ + sigprocmask(SIG_SETMASK, &old_sigset, NULL); if (data->abort) { - pr_err("Aborting listener service %d\n", - data->listener.id); + pr_err("Abort clnt %d waiting on lstnr svc %d, ret %d", + data->client.app_id, lstnr, ret); return -ENODEV; + } + + qseecom.send_resp_flag = 0; send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; send_data_rsp.listener_id = lstnr ; -- GitLab