summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-02-08 17:48:19 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-08 17:48:19 -0800
commit26c97534cb0a56956fc59dc260cb32d8e5b56f01 (patch)
treed80eed7f1e11518297e41adff03f8422536c6872 /drivers
parent07cd7cd92a2a6670845eba69b78e3d151d1f9743 (diff)
parent3f13257ff666b9d8c8a79dbfa8104036cffc177b (diff)
Merge "qseecom: add additonal reentrancy check before scm call"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/misc/qseecom.c10
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);