Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88435fb8 authored by Zhen Kong's avatar Zhen Kong
Browse files

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.

Change-Id: I09d374c763a316201e790d9003b0b9785debd44a
Signed-off-by: default avatarZhen Kong <zkong@codeaurora.org>
parent 22a3b390
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -1378,7 +1378,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));
@@ -1452,7 +1452,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;
@@ -1557,7 +1557,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);
@@ -1977,14 +1977,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;
@@ -2175,7 +2175,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);
@@ -2308,7 +2308,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;
@@ -2463,7 +2463,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);
@@ -2491,7 +2492,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;
@@ -2830,7 +2832,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;
@@ -4140,7 +4142,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_debug("Interrupted: exiting Listener Service = %d\n",