summaryrefslogtreecommitdiff
path: root/security
diff options
context:
space:
mode:
authorZhang Zhijie <zhangzj@rock-chips.com>2018-07-04 11:32:16 +0800
committerTao Huang <huangtao@rock-chips.com>2018-07-13 09:20:19 +0800
commita07ea942e3ad1fb07cde12c2666a156fae574daa (patch)
tree6f708fb4097950dee49ce18140c3d0493c625fb9 /security
parent78166d0543d687802632e28c3e62ac6f83ffe0a1 (diff)
OP-TEE: remove lock when call tee
OPTEE supports multicore, so the lock before enter tee is needless and can be removed to avoid unnecessary waiting. Change-Id: I4e9c5876ba69e362b598e0c0ca78e12a96704b58 Signed-off-by: Zhang Zhijie <zhangzj@rock-chips.com>
Diffstat (limited to 'security')
-rw-r--r--security/optee_linuxdriver/armtz/tee_tz_drv.c30
1 files changed, 8 insertions, 22 deletions
diff --git a/security/optee_linuxdriver/armtz/tee_tz_drv.c b/security/optee_linuxdriver/armtz/tee_tz_drv.c
index d1d23eb50d6a..56386a0521f3 100644
--- a/security/optee_linuxdriver/armtz/tee_tz_drv.c
+++ b/security/optee_linuxdriver/armtz/tee_tz_drv.c
@@ -120,32 +120,18 @@ static long tee_smc_call_switchcpu0(struct smc_param *param)
}
#endif /* SWITCH_CPU0_DEBUG */
-static void e_lock_teez(struct tee_tz *ptee)
+static void wait_completion_teez(struct tee_tz *ptee)
{
- mutex_lock(&ptee->mutex);
-}
-
-static void e_lock_wait_completion_teez(struct tee_tz *ptee)
-{
- /*
- * Release the lock until "something happens" and then reacquire it
- * again.
- *
- * This is needed when TEE returns "busy" and we need to try again
- * later.
- */
ptee->c_waiters++;
- mutex_unlock(&ptee->mutex);
/*
* Wait at most one second. Secure world is normally never busy
* more than that so we should normally never timeout.
*/
wait_for_completion_timeout(&ptee->c, HZ);
- mutex_lock(&ptee->mutex);
ptee->c_waiters--;
}
-static void e_unlock_teez(struct tee_tz *ptee)
+static void complete_teez(struct tee_tz *ptee)
{
/*
* If at least one thread is waiting for "something to happen" let
@@ -153,7 +139,6 @@ static void e_unlock_teez(struct tee_tz *ptee)
*/
if (ptee->c_waiters)
complete(&ptee->c);
- mutex_unlock(&ptee->mutex);
}
static void handle_rpc_func_cmd_mutex_wait(struct tee_tz *ptee,
@@ -458,7 +443,6 @@ static void call_tee(struct tee_tz *ptee,
param.a1 = parg32;
- e_lock_teez(ptee);
while (true) {
param.a0 = funcid;
@@ -478,17 +462,19 @@ static void call_tee(struct tee_tz *ptee,
* exit from secure world and needed resources may
* have become available).
*/
- e_lock_wait_completion_teez(ptee);
+ wait_completion_teez(ptee);
} else if (TEESMC_RETURN_IS_RPC(ret)) {
+ /* Wake up waiting task */
+ complete_teez(ptee);
/* Process the RPC. */
- e_unlock_teez(ptee);
funcid = handle_rpc(ptee, &param);
- e_lock_teez(ptee);
} else {
break;
}
}
- e_unlock_teez(ptee);
+
+ /* Wake up waiting task */
+ complete_teez(ptee);
switch (ret) {
case TEESMC_RETURN_UNKNOWN_FUNCTION: