From nobody Sun Sep 22 09:33:06 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2DDE8C433EF for ; Sun, 13 Feb 2022 16:21:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237055AbiBMQV0 (ORCPT ); Sun, 13 Feb 2022 11:21:26 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:39836 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233353AbiBMQVZ (ORCPT ); Sun, 13 Feb 2022 11:21:25 -0500 Received: from mailgw01.mediatek.com (unknown [60.244.123.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A0844E391 for ; Sun, 13 Feb 2022 08:21:17 -0800 (PST) X-UUID: a550d979978e4613b85bd0d28b026b98-20220214 X-UUID: a550d979978e4613b85bd0d28b026b98-20220214 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 744166561; Mon, 14 Feb 2022 00:21:14 +0800 Received: from mtkcas10.mediatek.inc (172.21.101.39) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.15; Mon, 14 Feb 2022 00:21:12 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas10.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 14 Feb 2022 00:21:12 +0800 From: Phil Chang To: CC: , , , , , Subject: [PATCH] tee: make tee_shm_register_kernel_buf vmalloc supported Date: Mon, 14 Feb 2022 00:21:10 +0800 Message-ID: <20220213162110.27210-1-phil.chang@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In some low-memory devices, it's hard to aquire large-orders pages, this patch allowed user using scatter pages to register shm. Signed-off-by: Phil Chang --- drivers/tee/optee/call.c | 2 +- drivers/tee/tee_shm.c | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index bd49ec934060..2082e632adff 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 nu= m_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; =20 mmap_read_lock(mm); diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index f31e29e8f1ca..861403588485 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -23,22 +23,38 @@ static void shm_put_kernel_pages(struct page **pages, s= ize_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; =20 - kiov =3D kcalloc(page_count, sizeof(*kiov), GFP_KERNEL); - if (!kiov) - return -ENOMEM; - - for (n =3D 0; n < page_count; n++) { - kiov[n].iov_base =3D (void *)(start + n * PAGE_SIZE); - kiov[n].iov_len =3D PAGE_SIZE; + if (is_vmalloc_addr((void *)start)) { + struct page *page; + int i; + + for (i =3D 0; i < page_count; i++) { + page =3D vmalloc_to_page((void *)(start + PAGE_SIZE * i)); + if (!page) + return -ENOMEM; + + get_page(page); + pages[i] =3D page; + } + rc =3D page_count; + } else { + struct kvec *kiov; + size_t n; + + kiov =3D kcalloc(page_count, sizeof(*kiov), GFP_KERNEL); + if (!kiov) + return -ENOMEM; + + for (n =3D 0; n < page_count; n++) { + kiov[n].iov_base =3D (void *)(start + n * PAGE_SIZE); + kiov[n].iov_len =3D PAGE_SIZE; + } + + rc =3D get_kernel_pages(kiov, page_count, 0, pages); + kfree(kiov); } =20 - rc =3D get_kernel_pages(kiov, page_count, 0, pages); - kfree(kiov); - return rc; } =20 --=20 2.25.1