Thread (3 messages) 3 messages, 3 authors, 2024-01-25

Re: [PATCH] optee: support wq_sleep_timeout

From: Jens Wiklander <hidden>
Date: 2024-01-25 15:02:22
Also in: linux-mediatek, lkml, op-tee

On Thu, Jan 25, 2024 at 6:28 AM gavin.liu [off-list ref] wrote:
From: Gavin Liu <redacted>

Add wq_sleep_timeout to support self waking when timeout for secure
driver usage.

Signed-off-by: Gavin Liu <redacted>
---
 drivers/tee/optee/notif.c         |  9 +++++++--
 drivers/tee/optee/optee_private.h |  2 +-
 drivers/tee/optee/rpc.c           | 10 ++++++++--
 3 files changed, 16 insertions(+), 5 deletions(-)
I'd like to see the corresponding secure world changes taking
advantage of this ABI change before we take this any further.

Thanks,
Jens
quoted hunk ↗ jump to hunk
diff --git a/drivers/tee/optee/notif.c b/drivers/tee/optee/notif.c
index 05212842b0a5..d5e5c0645609 100644
--- a/drivers/tee/optee/notif.c
+++ b/drivers/tee/optee/notif.c
@@ -29,7 +29,7 @@ static bool have_key(struct optee *optee, u_int key)
        return false;
 }

-int optee_notif_wait(struct optee *optee, u_int key)
+int optee_notif_wait(struct optee *optee, u_int key, u32 timeout)
 {
        unsigned long flags;
        struct notif_entry *entry;
@@ -70,7 +70,12 @@ int optee_notif_wait(struct optee *optee, u_int key)
         * Unlock temporarily and wait for completion.
         */
        spin_unlock_irqrestore(&optee->notif.lock, flags);
-       wait_for_completion(&entry->c);
+       if (timeout != 0) {
+               if (!wait_for_completion_timeout(&entry->c, timeout))
+                       rc = -ETIMEDOUT;
+       } else {
+               wait_for_completion(&entry->c);
+       }
        spin_lock_irqsave(&optee->notif.lock, flags);

        list_del(&entry->link);
diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
index 7a5243c78b55..da990c4016ec 100644
--- a/drivers/tee/optee/optee_private.h
+++ b/drivers/tee/optee/optee_private.h
@@ -252,7 +252,7 @@ struct optee_call_ctx {

 int optee_notif_init(struct optee *optee, u_int max_key);
 void optee_notif_uninit(struct optee *optee);
-int optee_notif_wait(struct optee *optee, u_int key);
+int optee_notif_wait(struct optee *optee, u_int key, u32 timeout);
 int optee_notif_send(struct optee *optee, u_int key);

 u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,
diff --git a/drivers/tee/optee/rpc.c b/drivers/tee/optee/rpc.c
index e69bc6380683..14e6246aaf05 100644
--- a/drivers/tee/optee/rpc.c
+++ b/drivers/tee/optee/rpc.c
@@ -130,6 +130,8 @@ static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx,
 static void handle_rpc_func_cmd_wq(struct optee *optee,
                                   struct optee_msg_arg *arg)
 {
+       int rc = 0;
+
        if (arg->num_params != 1)
                goto bad;
@@ -139,7 +141,8 @@ static void handle_rpc_func_cmd_wq(struct optee *optee,

        switch (arg->params[0].u.value.a) {
        case OPTEE_RPC_NOTIFICATION_WAIT:
-               if (optee_notif_wait(optee, arg->params[0].u.value.b))
+               rc = optee_notif_wait(optee, arg->params[0].u.value.b, arg->params[0].u.value.c);
+               if (rc)
                        goto bad;
                break;
        case OPTEE_RPC_NOTIFICATION_SEND:
@@ -153,7 +156,10 @@ static void handle_rpc_func_cmd_wq(struct optee *optee,
        arg->ret = TEEC_SUCCESS;
        return;
 bad:
-       arg->ret = TEEC_ERROR_BAD_PARAMETERS;
+       if (rc == -ETIMEDOUT)
+               arg->ret = TEEC_ERROR_BUSY;
+       else
+               arg->ret = TEEC_ERROR_BAD_PARAMETERS;
 }

 static void handle_rpc_func_cmd_wait(struct optee_msg_arg *arg)
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help