Re: [PATCH] optee: make tee_shm_register vmalloc supported

From: Sumit Garg
Date: Fri Feb 04 2022 - 06:09:16 EST


Hi,

On Fri, 4 Feb 2022 at 15:03, Phil Chang <phil.chang@xxxxxxxxxxxx> wrote:
>
> This patch allowed the tee shm use vmalloc area buffer.
>
> Signed-off-by: Phil Chang <phil.chang@xxxxxxxxxxxx>
> ---
>
> Hi,
>
> In some low-memory devices, it's hard to aquire large-orders pages,
> this pathes is allowed user use scatter pages to register shm.

This kind of info should go into the commit description describing why
this change is needed.

>
> Thanks.
>
> drivers/tee/optee/call.c | 2 +-
> drivers/tee/tee_shm.c | 14 ++++++++++++++
> 2 files changed, 15 insertions(+), 1 deletion(-)
>

Also, I would like this patch to be rebased on top of SHM updates
series [1] from Jens as there has been a lot of refactoring touching
these files.

[1] https://lists.trustedfirmware.org/archives/list/op-tee@xxxxxxxxxxxxxxxxxxxxxxxxx/thread/3J2IJX5LG2X4CZBYDLVA4PDVM4APMZSD/

-Sumit

> diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c
> index b25cc1fac945..937bcc7df8e4 100644
> --- a/drivers/tee/optee/call.c
> +++ b/drivers/tee/optee/call.c
> @@ -362,7 +362,7 @@ int optee_check_mem_type(unsigned long start, size_t num_pages)
> * Allow kernel address to register with OP-TEE as kernel
> * pages are configured as normal memory only.
> */
> - if (virt_addr_valid(start))
> + if (virt_addr_valid(start) || is_vmalloc_addr((void *)start))
> return 0;
>
> mmap_read_lock(mm);
> diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c
> index 499fccba3d74..31d0c10485ff 100644
> --- a/drivers/tee/tee_shm.c
> +++ b/drivers/tee/tee_shm.c
> @@ -195,6 +195,20 @@ struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long addr,
> if (flags & TEE_SHM_USER_MAPPED) {
> rc = pin_user_pages_fast(start, num_pages, FOLL_WRITE,
> shm->pages);
> + } else if (is_vmalloc_addr((void *)start)) {
> + struct page *page;
> + int i;
> +
> + for (i = 0; i < num_pages; i++) {
> + page = vmalloc_to_page((void *)(start + PAGE_SIZE * i));
> + if (!page) {
> + ret = ERR_PTR(-ENOMEM);
> + goto err;
> + }
> + get_page(page);
> + shm->pages[i] = page;
> + }
> + rc = num_pages;
> } else {
> struct kvec *kiov;
> int i;
> --
> 2.25.1