Unverified Commit a37de2ad authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

Merge tag 'tee-shm-vmalloc-for-v5.19' of...

Merge tag 'tee-shm-vmalloc-for-v5.19' of https://git.linaro.org/people/jens.wiklander/linux-tee into arm/drivers

TEE accept vmalloc()ed buffers for tee_shm_register_kernel_buf()

* tag 'tee-shm-vmalloc-for-v5.19' of https://git.linaro.org/people/jens.wiklander/linux-tee:
  tee: make tee_shm_register_kernel_buf vmalloc supported

Link: https://lore.kernel.org/r/20220503192916.GA3288817@jade


Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents a964ecd8 3e47235e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+25 −10
Original line number Diff line number Diff line
@@ -23,10 +23,24 @@ static void shm_put_kernel_pages(struct page **pages, size_t page_count)
static int shm_get_kernel_pages(unsigned long start, size_t page_count,
				struct page **pages)
{
	struct kvec *kiov;
	size_t n;
	int rc;

	if (is_vmalloc_addr((void *)start)) {
		struct page *page;

		for (n = 0; n < page_count; n++) {
			page = vmalloc_to_page((void *)(start + PAGE_SIZE * n));
			if (!page)
				return -ENOMEM;

			get_page(page);
			pages[n] = page;
		}
		rc = page_count;
	} else {
		struct kvec *kiov;

		kiov = kcalloc(page_count, sizeof(*kiov), GFP_KERNEL);
		if (!kiov)
			return -ENOMEM;
@@ -38,6 +52,7 @@ static int shm_get_kernel_pages(unsigned long start, size_t page_count,

		rc = get_kernel_pages(kiov, page_count, 0, pages);
		kfree(kiov);
	}

	return rc;
}