This patch allowed the tee shm use vmalloc area buffer.
Signed-off-by: Phil Chang phil.chang@mediatek.com ---
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.
Thanks.
drivers/tee/optee/call.c | 2 +- drivers/tee/tee_shm.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-)
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
Hi,
On Fri, 4 Feb 2022 at 15:03, Phil Chang phil.chang@mediatek.com wrote:
This patch allowed the tee shm use vmalloc area buffer.
Signed-off-by: Phil Chang phil.chang@mediatek.com
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...
-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
op-tee@lists.trustedfirmware.org