| From 3bd3ccdf16f3c9a4c778a210bf8f048ec6e9686e Mon Sep 17 00:00:00 2001 |
| From: Sumit Garg <sumit.garg@linaro.org> |
| Date: Mon, 30 Dec 2019 18:52:40 +0530 |
| Subject: [PATCH] optee: Fix multi page dynamic shm pool alloc |
| |
| commit 5a769f6ff439cedc547395a6dc78faa26108f741 upstream. |
| |
| optee_shm_register() expected pages to be passed as an array of page |
| pointers rather than as an array of contiguous pages. So fix that via |
| correctly passing pages as per expectation. |
| |
| Fixes: a249dd200d03 ("tee: optee: Fix dynamic shm pool allocations") |
| Reported-by: Vincent Cao <vincent.t.cao@intel.com> |
| Signed-off-by: Sumit Garg <sumit.garg@linaro.org> |
| Tested-by: Vincent Cao <vincent.t.cao@intel.com> |
| Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/tee/optee/shm_pool.c b/drivers/tee/optee/shm_pool.c |
| index 0332a5301d61..d767eebf30bd 100644 |
| --- a/drivers/tee/optee/shm_pool.c |
| +++ b/drivers/tee/optee/shm_pool.c |
| @@ -28,9 +28,22 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, |
| shm->size = PAGE_SIZE << order; |
| |
| if (shm->flags & TEE_SHM_DMA_BUF) { |
| + unsigned int nr_pages = 1 << order, i; |
| + struct page **pages; |
| + |
| + pages = kcalloc(nr_pages, sizeof(pages), GFP_KERNEL); |
| + if (!pages) |
| + return -ENOMEM; |
| + |
| + for (i = 0; i < nr_pages; i++) { |
| + pages[i] = page; |
| + page++; |
| + } |
| + |
| shm->flags |= TEE_SHM_REGISTER; |
| - rc = optee_shm_register(shm->ctx, shm, &page, 1 << order, |
| + rc = optee_shm_register(shm->ctx, shm, pages, nr_pages, |
| (unsigned long)shm->kaddr); |
| + kfree(pages); |
| } |
| |
| return rc; |
| -- |
| 2.7.4 |
| |