aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhen Kong <zkong@codeaurora.org>2019-04-23 22:16:56 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-08-18 22:46:04 -0700
commitccfd404863672100cd0e50542946df43792ad116 (patch)
tree7a84195d149e3e94aff7d9e990f727bbfe72f448
parenta4c2d5e29a82f8414325a79e5a36292e1a306902 (diff)
qseecom: improve app_block_wq processingLA.UM.7.3.r1-08200-sdm845.0
remove interrupt signal mask before waiting, and Wake up all threads waiting in app_block_wq. Change-Id: I0b441c2fd8a4f829c356492a8facd56f92c97884 Signed-off-by: Zhen Kong <zkong@codeaurora.org>
-rw-r--r--drivers/misc/qseecom.c31
1 files changed, 7 insertions, 24 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index 31e10f8f0ea0..d444046b9c19 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -1953,6 +1953,7 @@ exit:
}
qseecom.app_block_ref_cnt--;
+ wake_up_interruptible_all(&qseecom.app_block_wq);
if (rc)
return rc;
@@ -2305,24 +2306,15 @@ exit:
*/
static void __qseecom_reentrancy_check_if_no_app_blocked(uint32_t smc_id)
{
- sigset_t new_sigset, old_sigset;
-
if (qseecom.qsee_reentrancy_support > QSEE_REENTRANCY_PHASE_0 &&
qseecom.qsee_reentrancy_support < QSEE_REENTRANCY_PHASE_3 &&
IS_OWNER_TRUSTED_OS(TZ_SYSCALL_OWNER_ID(smc_id))) {
/* thread sleep until this app unblocked */
while (qseecom.app_block_ref_cnt > 0) {
- sigfillset(&new_sigset);
- sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset);
mutex_unlock(&app_access_lock);
- do {
- if (!wait_event_interruptible(
- qseecom.app_block_wq,
- (qseecom.app_block_ref_cnt == 0)))
- break;
- } while (1);
+ wait_event_interruptible(qseecom.app_block_wq,
+ (!qseecom.app_block_ref_cnt));
mutex_lock(&app_access_lock);
- sigprocmask(SIG_SETMASK, &old_sigset, NULL);
}
}
}
@@ -2335,24 +2327,15 @@ static void __qseecom_reentrancy_check_if_no_app_blocked(uint32_t smc_id)
static void __qseecom_reentrancy_check_if_this_app_blocked(
struct qseecom_registered_app_list *ptr_app)
{
- sigset_t new_sigset, old_sigset;
-
if (qseecom.qsee_reentrancy_support) {
ptr_app->check_block++;
while (ptr_app->app_blocked || qseecom.app_block_ref_cnt > 1) {
/* thread sleep until this app unblocked */
- sigfillset(&new_sigset);
- sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset);
mutex_unlock(&app_access_lock);
- do {
- if (!wait_event_interruptible(
- qseecom.app_block_wq,
- (!ptr_app->app_blocked &&
- qseecom.app_block_ref_cnt <= 1)))
- break;
- } while (1);
+ wait_event_interruptible(qseecom.app_block_wq,
+ (!ptr_app->app_blocked &&
+ qseecom.app_block_ref_cnt <= 1));
mutex_lock(&app_access_lock);
- sigprocmask(SIG_SETMASK, &old_sigset, NULL);
}
ptr_app->check_block--;
}
@@ -3254,7 +3237,7 @@ int __qseecom_process_reentrancy(struct qseecom_command_scm_resp *resp,
ret = __qseecom_reentrancy_process_incomplete_cmd(data, resp);
ptr_app->app_blocked = false;
qseecom.app_block_ref_cnt--;
- wake_up_interruptible(&qseecom.app_block_wq);
+ wake_up_interruptible_all(&qseecom.app_block_wq);
if (ret)
pr_err("process_incomplete_cmd failed err: %d\n",
ret);