mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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:
		
							parent
							
								
									49a57857ae
								
							
						
					
					
						commit
						42bf4152d8
					
				
					 3 changed files with 28 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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_supp *supp = &optee->supp;
 | 
			
		||||
	struct optee_supp_req *req = kzalloc(sizeof(*req), GFP_KERNEL);
 | 
			
		||||
	struct optee_supp_req *req;
 | 
			
		||||
	bool interruptable;
 | 
			
		||||
	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)
 | 
			
		||||
		return TEEC_ERROR_OUT_OF_MEMORY;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,6 +106,11 @@ static int tee_open(struct inode *inode, struct file *filp)
 | 
			
		|||
	if (IS_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;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -982,6 +987,14 @@ tee_client_open_context(struct tee_context *start,
 | 
			
		|||
	} while (IS_ERR(ctx) && PTR_ERR(ctx) != -ENOMEM);
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(tee_client_open_context);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,11 @@ struct tee_shm_pool;
 | 
			
		|||
 * @releasing:  flag that indicates if context is being released right now.
 | 
			
		||||
 *		It is needed to break circular dependency on context during
 | 
			
		||||
 *              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_device *teedev;
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +59,7 @@ struct tee_context {
 | 
			
		|||
	void *data;
 | 
			
		||||
	struct kref refcount;
 | 
			
		||||
	bool releasing;
 | 
			
		||||
	bool supp_nowait;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct tee_param_memref {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue