tee: add supp_nowait flag in tee_context struct

This flag indicates that requests in this context should not wait for
tee-supplicant daemon to be started if not present and just return
with an error code. It is needed for requests which should be
non-blocking in nature like ones arising from TEE based kernel drivers
or any in kernel api that uses TEE internal client interface.

Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
Sumit Garg 2019-01-29 11:19:36 +05:30 committed by Jens Wiklander
parent 49a57857ae
commit 42bf4152d8
3 changed files with 28 additions and 1 deletions

View File

@ -88,10 +88,18 @@ u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,
{ {
struct optee *optee = tee_get_drvdata(ctx->teedev); struct optee *optee = tee_get_drvdata(ctx->teedev);
struct optee_supp *supp = &optee->supp; struct optee_supp *supp = &optee->supp;
struct optee_supp_req *req = kzalloc(sizeof(*req), GFP_KERNEL); struct optee_supp_req *req;
bool interruptable; bool interruptable;
u32 ret; u32 ret;
/*
* Return in case there is no supplicant available and
* non-blocking request.
*/
if (!supp->ctx && ctx->supp_nowait)
return TEEC_ERROR_COMMUNICATION;
req = kzalloc(sizeof(*req), GFP_KERNEL);
if (!req) if (!req)
return TEEC_ERROR_OUT_OF_MEMORY; return TEEC_ERROR_OUT_OF_MEMORY;

View File

@ -106,6 +106,11 @@ static int tee_open(struct inode *inode, struct file *filp)
if (IS_ERR(ctx)) if (IS_ERR(ctx))
return PTR_ERR(ctx); return PTR_ERR(ctx);
/*
* Default user-space behaviour is to wait for tee-supplicant
* if not present for any requests in this context.
*/
ctx->supp_nowait = false;
filp->private_data = ctx; filp->private_data = ctx;
return 0; return 0;
} }
@ -982,6 +987,14 @@ tee_client_open_context(struct tee_context *start,
} while (IS_ERR(ctx) && PTR_ERR(ctx) != -ENOMEM); } while (IS_ERR(ctx) && PTR_ERR(ctx) != -ENOMEM);
put_device(put_dev); put_device(put_dev);
/*
* Default behaviour for in kernel client is to not wait for
* tee-supplicant if not present for any requests in this context.
* Also this flag could be configured again before call to
* tee_client_open_session() if any in kernel client requires
* different behaviour.
*/
ctx->supp_nowait = true;
return ctx; return ctx;
} }
EXPORT_SYMBOL_GPL(tee_client_open_context); EXPORT_SYMBOL_GPL(tee_client_open_context);

View File

@ -47,6 +47,11 @@ struct tee_shm_pool;
* @releasing: flag that indicates if context is being released right now. * @releasing: flag that indicates if context is being released right now.
* It is needed to break circular dependency on context during * It is needed to break circular dependency on context during
* shared memory release. * shared memory release.
* @supp_nowait: flag that indicates that requests in this context should not
* wait for tee-supplicant daemon to be started if not present
* and just return with an error code. It is needed for requests
* that arises from TEE based kernel drivers that should be
* non-blocking in nature.
*/ */
struct tee_context { struct tee_context {
struct tee_device *teedev; struct tee_device *teedev;
@ -54,6 +59,7 @@ struct tee_context {
void *data; void *data;
struct kref refcount; struct kref refcount;
bool releasing; bool releasing;
bool supp_nowait;
}; };
struct tee_param_memref { struct tee_param_memref {