Skip to content
/ linux Public

Commit c2f6107

Browse files
Matthew Wilcoxgregkh
authored andcommitted
tee: shm: Remove refcounting of kernel pages
[ Upstream commit 08d9a45 ] Earlier TEE subsystem assumed to refcount all the memory pages to be shared with TEE implementation to be refcounted. However, the slab allocations within the kernel don't allow refcounting kernel pages. It is rather better to trust the kernel clients to not free pages while being shared with TEE implementation. Hence, remove refcounting of kernel pages from register_shm_helper() API. Fixes: b9c0e49 ("mm: decline to manipulate the refcount on a slab page") Reported-by: Marco Felsch <m.felsch@pengutronix.de> Reported-by: Sven Püschel <s.pueschel@pengutronix.de> Signed-off-by: Matthew Wilcox <willy@infradead.org> Co-developed-by: Sumit Garg <sumit.garg@oss.qualcomm.com> Signed-off-by: Sumit Garg <sumit.garg@oss.qualcomm.com> Tested-by: Sven Püschel <s.pueschel@pengutronix.de> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 294e0c8 commit c2f6107

File tree

1 file changed

+0
-27
lines changed

1 file changed

+0
-27
lines changed

drivers/tee/tee_shm.c

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,11 @@ struct tee_shm_dma_mem {
2323
struct page *page;
2424
};
2525

26-
static void shm_put_kernel_pages(struct page **pages, size_t page_count)
27-
{
28-
size_t n;
29-
30-
for (n = 0; n < page_count; n++)
31-
put_page(pages[n]);
32-
}
33-
34-
static void shm_get_kernel_pages(struct page **pages, size_t page_count)
35-
{
36-
size_t n;
37-
38-
for (n = 0; n < page_count; n++)
39-
get_page(pages[n]);
40-
}
41-
4226
static void release_registered_pages(struct tee_shm *shm)
4327
{
4428
if (shm->pages) {
4529
if (shm->flags & TEE_SHM_USER_MAPPED)
4630
unpin_user_pages(shm->pages, shm->num_pages);
47-
else
48-
shm_put_kernel_pages(shm->pages, shm->num_pages);
4931

5032
kfree(shm->pages);
5133
}
@@ -477,13 +459,6 @@ register_shm_helper(struct tee_context *ctx, struct iov_iter *iter, u32 flags,
477459
goto err_put_shm_pages;
478460
}
479461

480-
/*
481-
* iov_iter_extract_kvec_pages does not get reference on the pages,
482-
* get a reference on them.
483-
*/
484-
if (iov_iter_is_kvec(iter))
485-
shm_get_kernel_pages(shm->pages, num_pages);
486-
487462
shm->offset = off;
488463
shm->size = len;
489464
shm->num_pages = num_pages;
@@ -499,8 +474,6 @@ register_shm_helper(struct tee_context *ctx, struct iov_iter *iter, u32 flags,
499474
err_put_shm_pages:
500475
if (!iov_iter_is_kvec(iter))
501476
unpin_user_pages(shm->pages, shm->num_pages);
502-
else
503-
shm_put_kernel_pages(shm->pages, shm->num_pages);
504477
err_free_shm_pages:
505478
kfree(shm->pages);
506479
err_free_shm:

0 commit comments

Comments
 (0)