diff options
| author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-12-03 09:32:21 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-12-03 09:32:20 -0800 |
| commit | 501a8de7b638d28c32338a124908258509b55371 (patch) | |
| tree | 09e6c7a6cf3051d05a4ee8c33d1962b9f63c28e3 /drivers | |
| parent | 96081867a4995112d65750656b2d1fe779a1f5c6 (diff) | |
| parent | 69fb586ddb1fe33b3570eef5e74e9d4a970937d2 (diff) | |
Merge "qseecom: fix a race condition when TA is blocked"
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/misc/qseecom.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 128eb0cce85b..0c7cbfb862b9 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1897,20 +1897,22 @@ static int __qseecom_process_blocked_on_listener_legacy( ptr_app->blocked_on_listener_id = resp->data; /* sleep until listener is available */ - qseecom.app_block_ref_cnt++; - ptr_app->app_blocked = true; - mutex_unlock(&app_access_lock); - if (wait_event_freezable( + do { + qseecom.app_block_ref_cnt++; + ptr_app->app_blocked = true; + mutex_unlock(&app_access_lock); + if (wait_event_freezable( list_ptr->listener_block_app_wq, !list_ptr->listener_in_use)) { - pr_err("Interrupted: listener_id %d, app_id %d\n", + pr_err("Interrupted: listener_id %d, app_id %d\n", resp->data, ptr_app->app_id); - ret = -ERESTARTSYS; - goto exit; - } - mutex_lock(&app_access_lock); - ptr_app->app_blocked = false; - qseecom.app_block_ref_cnt--; + ret = -ERESTARTSYS; + goto exit; + } + mutex_lock(&app_access_lock); + ptr_app->app_blocked = false; + qseecom.app_block_ref_cnt--; + } while (list_ptr->listener_in_use); ptr_app->blocked_on_listener_id = 0; /* notify the blocked app that listener is available */ @@ -1961,18 +1963,20 @@ static int __qseecom_process_blocked_on_listener_smcinvoke( pr_debug("lsntr %d in_use = %d\n", resp->data, list_ptr->listener_in_use); /* sleep until listener is available */ - qseecom.app_block_ref_cnt++; - mutex_unlock(&app_access_lock); - if (wait_event_freezable( + do { + qseecom.app_block_ref_cnt++; + mutex_unlock(&app_access_lock); + if (wait_event_freezable( list_ptr->listener_block_app_wq, !list_ptr->listener_in_use)) { - pr_err("Interrupted: listener_id %d, session_id %d\n", + pr_err("Interrupted: listener_id %d, session_id %d\n", resp->data, session_id); - ret = -ERESTARTSYS; - goto exit; - } - mutex_lock(&app_access_lock); - qseecom.app_block_ref_cnt--; + ret = -ERESTARTSYS; + goto exit; + } + mutex_lock(&app_access_lock); + qseecom.app_block_ref_cnt--; + } while (list_ptr->listener_in_use); /* notify TZ that listener is available */ pr_warn("Lsntr %d is available, unblock session(%d) in TZ\n", |
