Merge "qseecom: block system signals when waiting for listener available"
This commit is contained in:
commit
85e30309f0
1 changed files with 20 additions and 15 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*Qualcomm Secure Execution Environment Communicator (QSEECOM) driver
|
/*Qualcomm Secure Execution Environment Communicator (QSEECOM) driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 and
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
@ -1856,6 +1856,8 @@ static int __qseecom_process_blocked_on_listener_legacy(
|
||||||
struct qseecom_command_scm_resp continue_resp;
|
struct qseecom_command_scm_resp continue_resp;
|
||||||
bool found_app = false;
|
bool found_app = false;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
sigset_t new_sigset;
|
||||||
|
sigset_t old_sigset;
|
||||||
|
|
||||||
if (!resp || !data) {
|
if (!resp || !data) {
|
||||||
pr_err("invalid resp or data pointer\n");
|
pr_err("invalid resp or data pointer\n");
|
||||||
|
@ -1897,23 +1899,23 @@ static int __qseecom_process_blocked_on_listener_legacy(
|
||||||
ptr_app->blocked_on_listener_id = resp->data;
|
ptr_app->blocked_on_listener_id = resp->data;
|
||||||
|
|
||||||
/* sleep until listener is available */
|
/* sleep until listener is available */
|
||||||
|
sigfillset(&new_sigset);
|
||||||
|
sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
qseecom.app_block_ref_cnt++;
|
qseecom.app_block_ref_cnt++;
|
||||||
ptr_app->app_blocked = true;
|
ptr_app->app_blocked = true;
|
||||||
mutex_unlock(&app_access_lock);
|
mutex_unlock(&app_access_lock);
|
||||||
if (wait_event_freezable(
|
wait_event_freezable(
|
||||||
list_ptr->listener_block_app_wq,
|
list_ptr->listener_block_app_wq,
|
||||||
!list_ptr->listener_in_use)) {
|
!list_ptr->listener_in_use);
|
||||||
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);
|
mutex_lock(&app_access_lock);
|
||||||
ptr_app->app_blocked = false;
|
ptr_app->app_blocked = false;
|
||||||
qseecom.app_block_ref_cnt--;
|
qseecom.app_block_ref_cnt--;
|
||||||
} while (list_ptr->listener_in_use);
|
} while (list_ptr->listener_in_use);
|
||||||
|
|
||||||
|
sigprocmask(SIG_SETMASK, &old_sigset, NULL);
|
||||||
|
|
||||||
ptr_app->blocked_on_listener_id = 0;
|
ptr_app->blocked_on_listener_id = 0;
|
||||||
/* notify the blocked app that listener is available */
|
/* notify the blocked app that listener is available */
|
||||||
pr_warn("Lsntr %d is available, unblock app(%d) %s in TZ\n",
|
pr_warn("Lsntr %d is available, unblock app(%d) %s in TZ\n",
|
||||||
|
@ -1947,6 +1949,8 @@ static int __qseecom_process_blocked_on_listener_smcinvoke(
|
||||||
struct qseecom_continue_blocked_request_ireq ireq;
|
struct qseecom_continue_blocked_request_ireq ireq;
|
||||||
struct qseecom_command_scm_resp continue_resp;
|
struct qseecom_command_scm_resp continue_resp;
|
||||||
unsigned int session_id;
|
unsigned int session_id;
|
||||||
|
sigset_t new_sigset;
|
||||||
|
sigset_t old_sigset;
|
||||||
|
|
||||||
if (!resp) {
|
if (!resp) {
|
||||||
pr_err("invalid resp pointer\n");
|
pr_err("invalid resp pointer\n");
|
||||||
|
@ -1962,22 +1966,23 @@ static int __qseecom_process_blocked_on_listener_smcinvoke(
|
||||||
}
|
}
|
||||||
pr_debug("lsntr %d in_use = %d\n",
|
pr_debug("lsntr %d in_use = %d\n",
|
||||||
resp->data, list_ptr->listener_in_use);
|
resp->data, list_ptr->listener_in_use);
|
||||||
|
|
||||||
/* sleep until listener is available */
|
/* sleep until listener is available */
|
||||||
|
sigfillset(&new_sigset);
|
||||||
|
sigprocmask(SIG_SETMASK, &new_sigset, &old_sigset);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
qseecom.app_block_ref_cnt++;
|
qseecom.app_block_ref_cnt++;
|
||||||
mutex_unlock(&app_access_lock);
|
mutex_unlock(&app_access_lock);
|
||||||
if (wait_event_freezable(
|
wait_event_freezable(
|
||||||
list_ptr->listener_block_app_wq,
|
list_ptr->listener_block_app_wq,
|
||||||
!list_ptr->listener_in_use)) {
|
!list_ptr->listener_in_use);
|
||||||
pr_err("Interrupted: listener_id %d, session_id %d\n",
|
|
||||||
resp->data, session_id);
|
|
||||||
ret = -ERESTARTSYS;
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
mutex_lock(&app_access_lock);
|
mutex_lock(&app_access_lock);
|
||||||
qseecom.app_block_ref_cnt--;
|
qseecom.app_block_ref_cnt--;
|
||||||
} while (list_ptr->listener_in_use);
|
} while (list_ptr->listener_in_use);
|
||||||
|
|
||||||
|
sigprocmask(SIG_SETMASK, &old_sigset, NULL);
|
||||||
|
|
||||||
/* notify TZ that listener is available */
|
/* notify TZ that listener is available */
|
||||||
pr_warn("Lsntr %d is available, unblock session(%d) in TZ\n",
|
pr_warn("Lsntr %d is available, unblock session(%d) in TZ\n",
|
||||||
resp->data, session_id);
|
resp->data, session_id);
|
||||||
|
|
Loading…
Add table
Reference in a new issue