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 |
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 >
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
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 --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);
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(-)