diff mbox series

[v3,2/5] optee: simplify optee_release()

Message ID 20210722121757.1944658-3-jens.wiklander@linaro.org (mailing list archive)
State New, archived
Headers show
Series Add FF-A support in OP-TEE driver | expand

Commit Message

Jens Wiklander July 22, 2021, 12:17 p.m. UTC
Simplifies optee_release() with a new helper function,
optee_close_session_helper() which has been factored out from
optee_close_session().

A separate optee_release_supp() is added for the supplicant device.

Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
---
 drivers/tee/optee/call.c          | 31 ++++++++++-------
 drivers/tee/optee/core.c          | 55 +++++++++++--------------------
 drivers/tee/optee/optee_private.h |  1 +
 3 files changed, 39 insertions(+), 48 deletions(-)

Comments

Sumit Garg July 28, 2021, 8:45 a.m. UTC | #1
On Thu, 22 Jul 2021 at 17:48, Jens Wiklander <jens.wiklander@linaro.org> wrote:
>
> Simplifies optee_release() with a new helper function,
> optee_close_session_helper() which has been factored out from
> optee_close_session().
>

Simplification looks good to me.

> A separate optee_release_supp() is added for the supplicant device.
>

On similar terms, can we have separate optee_open_supp() for better
understanding?

-Sumit

> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
> ---
>  drivers/tee/optee/call.c          | 31 ++++++++++-------
>  drivers/tee/optee/core.c          | 55 +++++++++++--------------------
>  drivers/tee/optee/optee_private.h |  1 +
>  3 files changed, 39 insertions(+), 48 deletions(-)
>
> diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
> index 6e6eb836e9b6..9d8f5a95e42f 100644
> --- a/drivers/tee/optee/call.c
> +++ b/drivers/tee/optee/call.c
> @@ -288,12 +288,28 @@ int optee_open_session(struct tee_context *ctx,
>         return rc;
>  }
>
> -int optee_close_session(struct tee_context *ctx, u32 session)
> +int optee_close_session_helper(struct tee_context *ctx, u32 session)
>  {
> -       struct optee_context_data *ctxdata = ctx->data;
>         struct tee_shm *shm;
>         struct optee_msg_arg *msg_arg;
>         phys_addr_t msg_parg;
> +
> +       shm = get_msg_arg(ctx, 0, &msg_arg, &msg_parg);
> +       if (IS_ERR(shm))
> +               return PTR_ERR(shm);
> +
> +       msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
> +       msg_arg->session = session;
> +       optee_do_call_with_arg(ctx, msg_parg);
> +
> +       tee_shm_free(shm);
> +
> +       return 0;
> +}
> +
> +int optee_close_session(struct tee_context *ctx, u32 session)
> +{
> +       struct optee_context_data *ctxdata = ctx->data;
>         struct optee_session *sess;
>
>         /* Check that the session is valid and remove it from the list */
> @@ -306,16 +322,7 @@ int optee_close_session(struct tee_context *ctx, u32 session)
>                 return -EINVAL;
>         kfree(sess);
>
> -       shm = get_msg_arg(ctx, 0, &msg_arg, &msg_parg);
> -       if (IS_ERR(shm))
> -               return PTR_ERR(shm);
> -
> -       msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
> -       msg_arg->session = session;
> -       optee_do_call_with_arg(ctx, msg_parg);
> -
> -       tee_shm_free(shm);
> -       return 0;
> +       return optee_close_session_helper(ctx, session);
>  }
>
>  int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg,
> diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
> index ddb8f9ecf307..949223b214c3 100644
> --- a/drivers/tee/optee/core.c
> +++ b/drivers/tee/optee/core.c
> @@ -263,59 +263,42 @@ static int optee_open(struct tee_context *ctx)
>         return 0;
>  }
>
> -static void optee_release(struct tee_context *ctx)
> +static void optee_release_helper(struct tee_context *ctx,
> +                                int (*close_session)(struct tee_context *ctx,
> +                                                     u32 session))
>  {
>         struct optee_context_data *ctxdata = ctx->data;
> -       struct tee_device *teedev = ctx->teedev;
> -       struct optee *optee = tee_get_drvdata(teedev);
> -       struct tee_shm *shm;
> -       struct optee_msg_arg *arg = NULL;
> -       phys_addr_t parg;
>         struct optee_session *sess;
>         struct optee_session *sess_tmp;
>
>         if (!ctxdata)
>                 return;
>
> -       shm = tee_shm_alloc(ctx, sizeof(struct optee_msg_arg), TEE_SHM_MAPPED);
> -       if (!IS_ERR(shm)) {
> -               arg = tee_shm_get_va(shm, 0);
> -               /*
> -                * If va2pa fails for some reason, we can't call into
> -                * secure world, only free the memory. Secure OS will leak
> -                * sessions and finally refuse more sessions, but we will
> -                * at least let normal world reclaim its memory.
> -                */
> -               if (!IS_ERR(arg))
> -                       if (tee_shm_va2pa(shm, arg, &parg))
> -                               arg = NULL; /* prevent usage of parg below */
> -       }
> -
>         list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list,
>                                  list_node) {
>                 list_del(&sess->list_node);
> -               if (!IS_ERR_OR_NULL(arg)) {
> -                       memset(arg, 0, sizeof(*arg));
> -                       arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
> -                       arg->session = sess->session_id;
> -                       optee_do_call_with_arg(ctx, parg);
> -               }
> +               close_session(ctx, sess->session_id);
>                 kfree(sess);
>         }
>         kfree(ctxdata);
> +       ctx->data = NULL;
> +}
>
> -       if (!IS_ERR(shm))
> -               tee_shm_free(shm);
> +static void optee_release(struct tee_context *ctx)
> +{
> +       optee_release_helper(ctx, optee_close_session_helper);
> +}
>
> -       ctx->data = NULL;
> +static void optee_release_supp(struct tee_context *ctx)
> +{
> +       struct optee *optee = tee_get_drvdata(ctx->teedev);
>
> -       if (teedev == optee->supp_teedev) {
> -               if (optee->scan_bus_wq) {
> -                       destroy_workqueue(optee->scan_bus_wq);
> -                       optee->scan_bus_wq = NULL;
> -               }
> -               optee_supp_release(&optee->supp);
> +       optee_release_helper(ctx, optee_close_session_helper);
> +       if (optee->scan_bus_wq) {
> +               destroy_workqueue(optee->scan_bus_wq);
> +               optee->scan_bus_wq = NULL;
>         }
> +       optee_supp_release(&optee->supp);
>  }
>
>  static const struct tee_driver_ops optee_ops = {
> @@ -339,7 +322,7 @@ static const struct tee_desc optee_desc = {
>  static const struct tee_driver_ops optee_supp_ops = {
>         .get_version = optee_get_version,
>         .open = optee_open,
> -       .release = optee_release,
> +       .release = optee_release_supp,
>         .supp_recv = optee_supp_recv,
>         .supp_send = optee_supp_send,
>         .shm_register = optee_shm_register_supp,
> diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
> index e25b216a14ef..2b63b796645e 100644
> --- a/drivers/tee/optee/optee_private.h
> +++ b/drivers/tee/optee/optee_private.h
> @@ -152,6 +152,7 @@ u32 optee_do_call_with_arg(struct tee_context *ctx, phys_addr_t parg);
>  int optee_open_session(struct tee_context *ctx,
>                        struct tee_ioctl_open_session_arg *arg,
>                        struct tee_param *param);
> +int optee_close_session_helper(struct tee_context *ctx, u32 session);
>  int optee_close_session(struct tee_context *ctx, u32 session);
>  int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg,
>                       struct tee_param *param);
> --
> 2.31.1
>
Jens Wiklander July 29, 2021, 6:43 a.m. UTC | #2
On Wed, Jul 28, 2021 at 02:15:47PM +0530, Sumit Garg wrote:
> On Thu, 22 Jul 2021 at 17:48, Jens Wiklander <jens.wiklander@linaro.org> wrote:
> >
> > Simplifies optee_release() with a new helper function,
> > optee_close_session_helper() which has been factored out from
> > optee_close_session().
> >
> 
> Simplification looks good to me.
> 
> > A separate optee_release_supp() is added for the supplicant device.
> >
> 
> On similar terms, can we have separate optee_open_supp() for better
> understanding?

I'm not so keen on that. It wouldn't be much of a simplification since
we'd end up adding quite a few functions. optee_smc_open_supp(),
optee_ffa_open_supp(), optee_open_common(), and finally
optee_open_supp().

Thanks,
Jens
Sumit Garg July 29, 2021, 7:10 a.m. UTC | #3
On Thu, 29 Jul 2021 at 12:14, Jens Wiklander <jens.wiklander@linaro.org> wrote:
>
> On Wed, Jul 28, 2021 at 02:15:47PM +0530, Sumit Garg wrote:
> > On Thu, 22 Jul 2021 at 17:48, Jens Wiklander <jens.wiklander@linaro.org> wrote:
> > >
> > > Simplifies optee_release() with a new helper function,
> > > optee_close_session_helper() which has been factored out from
> > > optee_close_session().
> > >
> >
> > Simplification looks good to me.
> >
> > > A separate optee_release_supp() is added for the supplicant device.
> > >
> >
> > On similar terms, can we have separate optee_open_supp() for better
> > understanding?
>
> I'm not so keen on that. It wouldn't be much of a simplification since
> we'd end up adding quite a few functions. optee_smc_open_supp(),
> optee_ffa_open_supp(), optee_open_common(), and finally
> optee_open_supp().
>

Fair enough, FWIW:

Reviewed-by: Sumit Garg <sumit.garg@linaro.org>

-Sumit

> Thanks,
> Jens
diff mbox series

Patch

diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
index 6e6eb836e9b6..9d8f5a95e42f 100644
--- a/drivers/tee/optee/call.c
+++ b/drivers/tee/optee/call.c
@@ -288,12 +288,28 @@  int optee_open_session(struct tee_context *ctx,
 	return rc;
 }
 
-int optee_close_session(struct tee_context *ctx, u32 session)
+int optee_close_session_helper(struct tee_context *ctx, u32 session)
 {
-	struct optee_context_data *ctxdata = ctx->data;
 	struct tee_shm *shm;
 	struct optee_msg_arg *msg_arg;
 	phys_addr_t msg_parg;
+
+	shm = get_msg_arg(ctx, 0, &msg_arg, &msg_parg);
+	if (IS_ERR(shm))
+		return PTR_ERR(shm);
+
+	msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
+	msg_arg->session = session;
+	optee_do_call_with_arg(ctx, msg_parg);
+
+	tee_shm_free(shm);
+
+	return 0;
+}
+
+int optee_close_session(struct tee_context *ctx, u32 session)
+{
+	struct optee_context_data *ctxdata = ctx->data;
 	struct optee_session *sess;
 
 	/* Check that the session is valid and remove it from the list */
@@ -306,16 +322,7 @@  int optee_close_session(struct tee_context *ctx, u32 session)
 		return -EINVAL;
 	kfree(sess);
 
-	shm = get_msg_arg(ctx, 0, &msg_arg, &msg_parg);
-	if (IS_ERR(shm))
-		return PTR_ERR(shm);
-
-	msg_arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
-	msg_arg->session = session;
-	optee_do_call_with_arg(ctx, msg_parg);
-
-	tee_shm_free(shm);
-	return 0;
+	return optee_close_session_helper(ctx, session);
 }
 
 int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg,
diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c
index ddb8f9ecf307..949223b214c3 100644
--- a/drivers/tee/optee/core.c
+++ b/drivers/tee/optee/core.c
@@ -263,59 +263,42 @@  static int optee_open(struct tee_context *ctx)
 	return 0;
 }
 
-static void optee_release(struct tee_context *ctx)
+static void optee_release_helper(struct tee_context *ctx,
+				 int (*close_session)(struct tee_context *ctx,
+						      u32 session))
 {
 	struct optee_context_data *ctxdata = ctx->data;
-	struct tee_device *teedev = ctx->teedev;
-	struct optee *optee = tee_get_drvdata(teedev);
-	struct tee_shm *shm;
-	struct optee_msg_arg *arg = NULL;
-	phys_addr_t parg;
 	struct optee_session *sess;
 	struct optee_session *sess_tmp;
 
 	if (!ctxdata)
 		return;
 
-	shm = tee_shm_alloc(ctx, sizeof(struct optee_msg_arg), TEE_SHM_MAPPED);
-	if (!IS_ERR(shm)) {
-		arg = tee_shm_get_va(shm, 0);
-		/*
-		 * If va2pa fails for some reason, we can't call into
-		 * secure world, only free the memory. Secure OS will leak
-		 * sessions and finally refuse more sessions, but we will
-		 * at least let normal world reclaim its memory.
-		 */
-		if (!IS_ERR(arg))
-			if (tee_shm_va2pa(shm, arg, &parg))
-				arg = NULL; /* prevent usage of parg below */
-	}
-
 	list_for_each_entry_safe(sess, sess_tmp, &ctxdata->sess_list,
 				 list_node) {
 		list_del(&sess->list_node);
-		if (!IS_ERR_OR_NULL(arg)) {
-			memset(arg, 0, sizeof(*arg));
-			arg->cmd = OPTEE_MSG_CMD_CLOSE_SESSION;
-			arg->session = sess->session_id;
-			optee_do_call_with_arg(ctx, parg);
-		}
+		close_session(ctx, sess->session_id);
 		kfree(sess);
 	}
 	kfree(ctxdata);
+	ctx->data = NULL;
+}
 
-	if (!IS_ERR(shm))
-		tee_shm_free(shm);
+static void optee_release(struct tee_context *ctx)
+{
+	optee_release_helper(ctx, optee_close_session_helper);
+}
 
-	ctx->data = NULL;
+static void optee_release_supp(struct tee_context *ctx)
+{
+	struct optee *optee = tee_get_drvdata(ctx->teedev);
 
-	if (teedev == optee->supp_teedev) {
-		if (optee->scan_bus_wq) {
-			destroy_workqueue(optee->scan_bus_wq);
-			optee->scan_bus_wq = NULL;
-		}
-		optee_supp_release(&optee->supp);
+	optee_release_helper(ctx, optee_close_session_helper);
+	if (optee->scan_bus_wq) {
+		destroy_workqueue(optee->scan_bus_wq);
+		optee->scan_bus_wq = NULL;
 	}
+	optee_supp_release(&optee->supp);
 }
 
 static const struct tee_driver_ops optee_ops = {
@@ -339,7 +322,7 @@  static const struct tee_desc optee_desc = {
 static const struct tee_driver_ops optee_supp_ops = {
 	.get_version = optee_get_version,
 	.open = optee_open,
-	.release = optee_release,
+	.release = optee_release_supp,
 	.supp_recv = optee_supp_recv,
 	.supp_send = optee_supp_send,
 	.shm_register = optee_shm_register_supp,
diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h
index e25b216a14ef..2b63b796645e 100644
--- a/drivers/tee/optee/optee_private.h
+++ b/drivers/tee/optee/optee_private.h
@@ -152,6 +152,7 @@  u32 optee_do_call_with_arg(struct tee_context *ctx, phys_addr_t parg);
 int optee_open_session(struct tee_context *ctx,
 		       struct tee_ioctl_open_session_arg *arg,
 		       struct tee_param *param);
+int optee_close_session_helper(struct tee_context *ctx, u32 session);
 int optee_close_session(struct tee_context *ctx, u32 session);
 int optee_invoke_func(struct tee_context *ctx, struct tee_ioctl_invoke_arg *arg,
 		      struct tee_param *param);