diff options
author | Zhen Kong <zkong@codeaurora.org> | 2019-04-23 22:16:56 -0700 |
---|---|---|
committer | Eva Huang <evahuang@google.com> | 2019-05-08 15:53:20 +0800 |
commit | 766ebbc83605250c7cf8be3ce43dfbde7e2364fd (patch) | |
tree | 293d7be0f476756b9848d0272dae149aac1b6bd4 | |
parent | 519155c2cdf56710ac73a80c56e12f71a1440e34 (diff) |
qseecom: improve app_block_wq processingandroid-q-preview-4_r0.4android-q-preview-4_r0.3
remove interrupt signal mask before waiting, and
Wake up all threads waiting in app_block_wq.
Bug: 129524800
Change-Id: I0b441c2fd8a4f829c356492a8facd56f92c97884
Signed-off-by: Zhen Kong <zkong@codeaurora.org>
-rw-r--r-- | drivers/misc/qseecom.c | 31 |
1 files changed, 7 insertions, 24 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 8ff240d70e06..2d829e626198 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1846,6 +1846,7 @@ err_resp: __qseecom_disable_clk(CLK_QSEE); } + wake_up_interruptible_all(&qseecom.app_block_wq); if (rc) return rc; @@ -2197,24 +2198,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); } } } @@ -2227,24 +2219,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--; } @@ -3146,7 +3129,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); |