Thread (2 messages) 2 messages, 2 authors, 2022-02-04

Re: [PATCH] optee: make tee_shm_register vmalloc supported

From: Sumit Garg <hidden>
Date: 2022-02-04 11:09:14
Also in: linux-mediatek, lkml, op-tee

Hi,

On Fri, 4 Feb 2022 at 15:03, Phil Chang [off-list ref] wrote:
This patch allowed the tee shm use vmalloc area buffer.

Signed-off-by: Phil Chang <redacted>
---

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@lists.trustedfirmware.org/thread/3J2IJX5LG2X4CZBYDLVA4PDVM4APMZSD/

-Sumit
quoted hunk ↗ jump to hunk
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
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help