diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2017-02-08 17:48:19 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-02-08 17:48:19 -0800 |
commit | 26c97534cb0a56956fc59dc260cb32d8e5b56f01 (patch) | |
tree | d80eed7f1e11518297e41adff03f8422536c6872 /drivers | |
parent | 07cd7cd92a2a6670845eba69b78e3d151d1f9743 (diff) | |
parent | 3f13257ff666b9d8c8a79dbfa8104036cffc177b (diff) |
Merge "qseecom: add additonal reentrancy check before scm call"
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/misc/qseecom.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 1653f7e1ae99..d3b41331faec 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -2135,22 +2135,24 @@ static void __qseecom_reentrancy_check_if_no_app_blocked(uint32_t smc_id) } /* - * scm_call send command to a blocked TZ app will fail - * So, first check and then wait until this apps is unblocked + * scm_call of send data will fail if this TA is blocked or there are more + * than one TA requesting listener services; So, first check to see if need + * to wait. */ 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) { - while (ptr_app->app_blocked) { + 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_freezable(qseecom.app_block_wq, - !ptr_app->app_blocked)) + (!ptr_app->app_blocked && + qseecom.app_block_ref_cnt <= 1))) break; } while (1); mutex_lock(&app_access_lock); |