diff options
author | Zhen Kong <zkong@codeaurora.org> | 2019-03-25 10:56:08 -0700 |
---|---|---|
committer | Craft Ju <craftju@google.com> | 2019-05-29 06:26:31 +0000 |
commit | 1fffe9bd290a1bc09f5e798f4b3ea20b2540dabd (patch) | |
tree | b7ef68b664fac4c127a7d2e52750377d65dfe689 | |
parent | 23cee55ae3bd18fa5881e437e2b59d7a939bab88 (diff) |
qseecom: use wait_event_interruptible
Kernel threads are not freezable by default, change to use
wait_event_interruptible to prevent a frozen qseecom thread
being blocked until another frozen thread is thawed.
Bug: 133120616
Bug: 133128687
Change-Id: I09d374c763a316201e790d9003b0b9785debd44a
Signed-off-by: Zhen Kong <zkong@codeaurora.org>
-rw-r--r-- | drivers/misc/qseecom.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index b453885d705d..d2d1a5e2756a 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1229,7 +1229,7 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data, pr_debug("register %d has to wait\n", rcvd_lstnr.listener_id); mutex_unlock(&listener_access_lock); - ret = wait_event_freezable( + ret = wait_event_interruptible( qseecom.register_lsnr_pending_wq, list_empty( &qseecom.unregister_lsnr_pending_list_head)); @@ -1304,7 +1304,7 @@ static int __qseecom_unregister_listener(struct qseecom_dev_handle *data, } while (atomic_read(&data->ioctl_count) > 1) { - if (wait_event_freezable(data->abort_wq, + if (wait_event_interruptible(data->abort_wq, atomic_read(&data->ioctl_count) <= 1)) { pr_err("Interrupted from abort\n"); ret = -ERESTARTSYS; @@ -1412,7 +1412,7 @@ static void __wakeup_unregister_listener_kthread(void) static int __qseecom_unregister_listener_kthread_func(void *data) { while (!kthread_should_stop()) { - wait_event_freezable( + wait_event_interruptible( qseecom.unregister_lsnr_kthread_wq, atomic_read(&qseecom.unregister_lsnr_kthread_state) == LSNR_UNREG_KT_WAKEUP); @@ -1840,14 +1840,14 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, * send_resp_flag. */ if (!qseecom.qsee_reentrancy_support && - !wait_event_freezable(qseecom.send_resp_wq, + !wait_event_interruptible(qseecom.send_resp_wq, __qseecom_listener_has_sent_rsp( data, ptr_svc))) { break; } if (qseecom.qsee_reentrancy_support && - !wait_event_freezable(qseecom.send_resp_wq, + !wait_event_interruptible(qseecom.send_resp_wq, __qseecom_reentrancy_listener_has_sent_rsp( data, ptr_svc))) { break; @@ -2023,7 +2023,7 @@ static int __qseecom_process_reentrancy_blocked_on_listener( ptr_app->app_blocked = true; mutex_unlock(&listener_access_lock); mutex_unlock(&app_access_lock); - wait_event_freezable( + wait_event_interruptible( list_ptr->listener_block_app_wq, !list_ptr->listener_in_use); mutex_lock(&app_access_lock); @@ -2156,7 +2156,7 @@ static int __qseecom_reentrancy_process_incomplete_cmd( mutex_unlock(&listener_access_lock); mutex_unlock(&app_access_lock); do { - if (!wait_event_freezable(qseecom.send_resp_wq, + if (!wait_event_interruptible(qseecom.send_resp_wq, __qseecom_reentrancy_listener_has_sent_rsp( data, ptr_svc))) { break; @@ -2303,7 +2303,8 @@ static void __qseecom_reentrancy_check_if_no_app_blocked(uint32_t smc_id) sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset); mutex_unlock(&app_access_lock); do { - if (!wait_event_freezable(qseecom.app_block_wq, + if (!wait_event_interruptible( + qseecom.app_block_wq, (qseecom.app_block_ref_cnt == 0))) break; } while (1); @@ -2331,7 +2332,8 @@ static void __qseecom_reentrancy_check_if_this_app_blocked( sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset); mutex_unlock(&app_access_lock); do { - if (!wait_event_freezable(qseecom.app_block_wq, + if (!wait_event_interruptible( + qseecom.app_block_wq, (!ptr_app->app_blocked && qseecom.app_block_ref_cnt <= 1))) break; @@ -2662,7 +2664,7 @@ static int __qseecom_cleanup_app(struct qseecom_dev_handle *data) if (qseecom.qsee_reentrancy_support) mutex_unlock(&app_access_lock); while (atomic_read(&data->ioctl_count) > 1) { - if (wait_event_freezable(data->abort_wq, + if (wait_event_interruptible(data->abort_wq, atomic_read(&data->ioctl_count) <= 1)) { pr_err("Interrupted from abort\n"); ret = -ERESTARTSYS; @@ -4001,7 +4003,7 @@ static int qseecom_receive_req(struct qseecom_dev_handle *data) mutex_unlock(&listener_access_lock); while (1) { - if (wait_event_freezable(this_lstnr->rcv_req_wq, + if (wait_event_interruptible(this_lstnr->rcv_req_wq, __qseecom_listener_has_rcvd_req(data, this_lstnr))) { pr_warn("Interrupted: exiting Listener Service = %d\n", |