aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhen Kong <zkong@codeaurora.org>2019-03-25 10:56:08 -0700
committerCraft Ju <craftju@google.com>2019-05-29 06:26:31 +0000
commit1fffe9bd290a1bc09f5e798f4b3ea20b2540dabd (patch)
treeb7ef68b664fac4c127a7d2e52750377d65dfe689
parent23cee55ae3bd18fa5881e437e2b59d7a939bab88 (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.c24
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",