From nobody Tue Jun 30 04:49:39 2026 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 B4C51C4321E for ; Tue, 25 Jan 2022 16:33:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1583718AbiAYQdh (ORCPT ); Tue, 25 Jan 2022 11:33:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37344 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1379305AbiAYQ3s (ORCPT ); Tue, 25 Jan 2022 11:29:48 -0500 Received: from mail-lj1-x22f.google.com (mail-lj1-x22f.google.com [IPv6:2a00:1450:4864:20::22f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D93F5C06173B for ; Tue, 25 Jan 2022 08:29:47 -0800 (PST) Received: by mail-lj1-x22f.google.com with SMTP id q127so2798121ljq.2 for ; Tue, 25 Jan 2022 08:29:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oN4lu8lbyhaxFZyXszWUPj3DflZg95OHRJxVYyEjsXM=; b=d4Lgc7EeeMJ4uPc5SPPd5GZD4n3Q9Xc67fU5XsOVjJGh8lxQ9Xp0bEs6OGoLMusZst peZ0AyCrvHbdXCpbRqOj9fpepFn2qQV4+gVXwJnK0q/DaZ8zXvEvlMsKh9uOqMvCpJFN jxjzbxuD1+kEXfneEbg7ydFbCLL3bdlC8CtpbSzzJrKc9x8skOSJbvLr6SmpLMV0FQpG 6j8EuRDEJ7P7Wed2SpaasZWtHsWeVFEQLmeqRJf0ZVnEXa4mkbM6JO8ExgBGn2WM3lWg 7dto3Y/85cqfmQVP/l9aYE4mQHtZ/IqgCpSo/P83qKGYu0fYayOd/J5tx4Vl63XryQ/j K9+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oN4lu8lbyhaxFZyXszWUPj3DflZg95OHRJxVYyEjsXM=; b=zxWYIjHexnd7esWNF+GT+mEp/NNQ6cqze1VFY03WiL8DoeX1xWXoirjYtHwYyquoav OWNXdNn1frIftfwKptocV7vfwh2exgY0qSZLiLteg7X2LdSfYWuCUIncK48FCQydXEaT pRH9cYSpPhjt7Cnyx3ykvjeuW7TsXL3qI96Kt2ioLyJqirI/Cnt22ZNU9cTIyHiDJ+JO LhIfSXUlkJXibqXy7mOdFtN62LeE5/Oo2qKMLA1zDtb8wuorHltg6NMUhpWTxgIgzQ6Q Yac8RiS0xkV01eKVNidCPRC4B6FGuzqqkkCDy6W4kkYAMxna2cnrkmPGWGcEt11VK4Q/ IDsw== X-Gm-Message-State: AOAM531qI6RrbPx37klDCQdqkkqGumPXPI7PKLlyMv0la9wqXYPOdr21 hbEube+YW9Ld6WqxsbFJ6w4+r8DuI59Sng== X-Google-Smtp-Source: ABdhPJz5+F6eAqDaurF5xrLoqgASnvG4LkTEdjgcOydVL9zTEF4lTZEVGbQYh92zv4eVfY5oe+qQMQ== X-Received: by 2002:a2e:913:: with SMTP id 19mr7947878ljj.299.1643128185951; Tue, 25 Jan 2022 08:29:45 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:45 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 01/12] hwrng: optee-rng: use tee_shm_alloc_kernel_buf() Date: Tue, 25 Jan 2022 17:29:27 +0100 Message-Id: <20220125162938.838382-2-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Uses the new simplified tee_shm_alloc_kernel_buf() function instead of the old deprecated tee_shm_alloc() function which required specific TEE_SHM-flags. Reviewed-by: Sumit Garg Signed-off-by: Jens Wiklander --- drivers/char/hw_random/optee-rng.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/char/hw_random/optee-rng.c b/drivers/char/hw_random/op= tee-rng.c index 135a82590923..a948c0727b2b 100644 --- a/drivers/char/hw_random/optee-rng.c +++ b/drivers/char/hw_random/optee-rng.c @@ -145,10 +145,10 @@ static int optee_rng_init(struct hwrng *rng) struct optee_rng_private *pvt_data =3D to_optee_rng_private(rng); struct tee_shm *entropy_shm_pool =3D NULL; =20 - entropy_shm_pool =3D tee_shm_alloc(pvt_data->ctx, MAX_ENTROPY_REQ_SZ, - TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); + entropy_shm_pool =3D tee_shm_alloc_kernel_buf(pvt_data->ctx, + MAX_ENTROPY_REQ_SZ); if (IS_ERR(entropy_shm_pool)) { - dev_err(pvt_data->dev, "tee_shm_alloc failed\n"); + dev_err(pvt_data->dev, "tee_shm_alloc_kernel_buf failed\n"); return PTR_ERR(entropy_shm_pool); } =20 --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 C4354C43219 for ; Tue, 25 Jan 2022 16:33:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1583735AbiAYQdj (ORCPT ); Tue, 25 Jan 2022 11:33:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37346 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1379839AbiAYQ3t (ORCPT ); Tue, 25 Jan 2022 11:29:49 -0500 Received: from mail-lj1-x22e.google.com (mail-lj1-x22e.google.com [IPv6:2a00:1450:4864:20::22e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4A55C06173B for ; Tue, 25 Jan 2022 08:29:48 -0800 (PST) Received: by mail-lj1-x22e.google.com with SMTP id j14so15992050lja.3 for ; Tue, 25 Jan 2022 08:29:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yn8zIxo8jyjO0ELBYvTuGmQzkeFiyQ40SLBI74VyhvY=; b=U6/8Cu8EEapXKBRoXxg85Avz9U7XFIDJQViGrn5MQCdkZ1CwYUNnJUqBTdOH14w6LP sajAXN85TP4haUIQvP+z8bg/5u9nnQFMqzlRsnoNdX78u613weSxNAZPanujtXZn69hl ESLSKo8+3WI8hsU0HisbY0r5nbSSVfCj6HkLNO0ochr4gv5vbUOGIJaoBDN7USHSyxXH pRwiyuff8brNpaTXwM3xLAhn4yEp9nJxaco++7aAHWn/uwhswiIRS3IzNUlLFlxCwqt7 U0/rx8TV/Aa5i7sVh+TGPt7YuPa41G/JMuLm4v1G59Q361KYodZB5LyqaP7WBde5jwi/ usHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yn8zIxo8jyjO0ELBYvTuGmQzkeFiyQ40SLBI74VyhvY=; b=01PYt6BwymaxastuKI9ObBgyl9XcvEcVndJFVwZAGliPxgf1fj5sAQjDS6VP7JmbSx LwUhgAKr6JD0opLOd4ecYOXy7Dr0q476czJHwWxhUlbHrIJENzFG0y9NCCP3I4KHe9pV 55MZidpVRa46AGCPRLVOm6cnlzOM7KgCzHlp1xCAQ+H+M4C/nrq/fI6zCLAxQoav40cD s24j1UwV2uSi0qcGT1X17AvSfQdwcbcF3ER06gVVK2b865/g8xrltkEs+jjvJeSXGphh YXPcM4L7W7FkCjCU3tboT2QR3FhUmmDKGxAzMSFrCAdadMAdelTkfWyuxPzoMvMqYwM9 RDVQ== X-Gm-Message-State: AOAM533d4BkcbLp3CJfZFelsXnC0npbA4m3uF8XB/MK9zqmW+NzOTfik BXvQmN08Ivum5i0y1cd3ouFdTfoPr/sg7A== X-Google-Smtp-Source: ABdhPJymult2DexRFamwZgT8ITwinSya1EcZVtgiH9wRs5XpBJW4oHP8wAEyTm+DEErtHTEYy7JquQ== X-Received: by 2002:a05:651c:b2a:: with SMTP id b42mr14571869ljr.168.1643128186988; Tue, 25 Jan 2022 08:29:46 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:46 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 02/12] tee: remove unused tee_shm_pool_alloc_res_mem() Date: Tue, 25 Jan 2022 17:29:28 +0100 Message-Id: <20220125162938.838382-3-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" None of the drivers in the TEE subsystem uses tee_shm_pool_alloc_res_mem() so remove the function. Reviewed-by: Sumit Garg Signed-off-by: Jens Wiklander --- drivers/tee/tee_shm_pool.c | 56 -------------------------------------- include/linux/tee_drv.h | 30 -------------------- 2 files changed, 86 deletions(-) diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c index fcbb461fc59c..a9f9d50fd181 100644 --- a/drivers/tee/tee_shm_pool.c +++ b/drivers/tee/tee_shm_pool.c @@ -47,62 +47,6 @@ static const struct tee_shm_pool_mgr_ops pool_ops_generi= c =3D { .destroy_poolmgr =3D pool_op_gen_destroy_poolmgr, }; =20 -/** - * tee_shm_pool_alloc_res_mem() - Create a shared memory pool from reserved - * memory range - * @priv_info: Information for driver private shared memory pool - * @dmabuf_info: Information for dma-buf shared memory pool - * - * Start and end of pools will must be page aligned. - * - * Allocation with the flag TEE_SHM_DMA_BUF set will use the range supplied - * in @dmabuf, others will use the range provided by @priv. - * - * @returns pointer to a 'struct tee_shm_pool' or an ERR_PTR on failure. - */ -struct tee_shm_pool * -tee_shm_pool_alloc_res_mem(struct tee_shm_pool_mem_info *priv_info, - struct tee_shm_pool_mem_info *dmabuf_info) -{ - struct tee_shm_pool_mgr *priv_mgr; - struct tee_shm_pool_mgr *dmabuf_mgr; - void *rc; - - /* - * Create the pool for driver private shared memory - */ - rc =3D tee_shm_pool_mgr_alloc_res_mem(priv_info->vaddr, priv_info->paddr, - priv_info->size, - 3 /* 8 byte aligned */); - if (IS_ERR(rc)) - return rc; - priv_mgr =3D rc; - - /* - * Create the pool for dma_buf shared memory - */ - rc =3D tee_shm_pool_mgr_alloc_res_mem(dmabuf_info->vaddr, - dmabuf_info->paddr, - dmabuf_info->size, PAGE_SHIFT); - if (IS_ERR(rc)) - goto err_free_priv_mgr; - dmabuf_mgr =3D rc; - - rc =3D tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); - if (IS_ERR(rc)) - goto err_free_dmabuf_mgr; - - return rc; - -err_free_dmabuf_mgr: - tee_shm_pool_mgr_destroy(dmabuf_mgr); -err_free_priv_mgr: - tee_shm_pool_mgr_destroy(priv_mgr); - - return rc; -} -EXPORT_SYMBOL_GPL(tee_shm_pool_alloc_res_mem); - struct tee_shm_pool_mgr *tee_shm_pool_mgr_alloc_res_mem(unsigned long vadd= r, phys_addr_t paddr, size_t size, diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index 5e1533ee3785..6b0f0d01ebdf 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -278,36 +278,6 @@ static inline void tee_shm_pool_mgr_destroy(struct tee= _shm_pool_mgr *poolm) poolm->ops->destroy_poolmgr(poolm); } =20 -/** - * struct tee_shm_pool_mem_info - holds information needed to create a sha= red - * memory pool - * @vaddr: Virtual address of start of pool - * @paddr: Physical address of start of pool - * @size: Size in bytes of the pool - */ -struct tee_shm_pool_mem_info { - unsigned long vaddr; - phys_addr_t paddr; - size_t size; -}; - -/** - * tee_shm_pool_alloc_res_mem() - Create a shared memory pool from reserved - * memory range - * @priv_info: Information for driver private shared memory pool - * @dmabuf_info: Information for dma-buf shared memory pool - * - * Start and end of pools will must be page aligned. - * - * Allocation with the flag TEE_SHM_DMA_BUF set will use the range supplied - * in @dmabuf, others will use the range provided by @priv. - * - * @returns pointer to a 'struct tee_shm_pool' or an ERR_PTR on failure. - */ -struct tee_shm_pool * -tee_shm_pool_alloc_res_mem(struct tee_shm_pool_mem_info *priv_info, - struct tee_shm_pool_mem_info *dmabuf_info); - /** * tee_shm_pool_free() - Free a shared memory pool * @pool: The shared memory pool to free --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 756BAC4321E for ; Tue, 25 Jan 2022 16:43:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1451064AbiAYQdq (ORCPT ); Tue, 25 Jan 2022 11:33:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37356 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1380219AbiAYQ3u (ORCPT ); Tue, 25 Jan 2022 11:29:50 -0500 Received: from mail-lf1-x129.google.com (mail-lf1-x129.google.com [IPv6:2a00:1450:4864:20::129]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A4AFC06173B for ; Tue, 25 Jan 2022 08:29:50 -0800 (PST) Received: by mail-lf1-x129.google.com with SMTP id bu18so57823376lfb.5 for ; Tue, 25 Jan 2022 08:29:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZLkFwdHW7tpL1lpDBNXdPL4T4si80CJ3ca8C0Rhph3U=; b=oRgAlIHm6wWyN2asjrWvedJdamiN7DJRaW2stasAGmr7toukW9AkjcwSqned/kk5/z c5YF6RrmHglNSxAP7jvWkfUV3iEeNpE3FiJ8my2VCmPcpVsW3yJ3IiAnYONRmUZM6qRp Lanc8yOL1WZdpqQU1OnpnsLwdsBr19IS7cIxpcTPlEO/8Mp7XJIRwHXif9cR4hHVDQdO aHin8GuDKIeDbQqZBVwmnE5lNEhSkhyEwgmVMJhKf+2vNX5YPRhqrDiYvRcXWaLftLYp VJgPOr2rROiaLLtyxGByft74FWkxGhl6ZvIq82vqeb6ZWpI5op8/+WuIaQljBymKS2zv 0+kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZLkFwdHW7tpL1lpDBNXdPL4T4si80CJ3ca8C0Rhph3U=; b=69THxqUB+B18N7I7b2idl00//SiuZj9ZLlidil7YaeGecUAX0Bzt+nCyejQv9Jxi7g ew1A+51sluNCDZRAhTdXJG7f27l47k3Ha7o5J/Mcn/DmHaz2plVzKz5YZbw/GeEuWNH/ 7lfrUP8U9QfF9tjjix2b2SuK5IZqM9OagA03vFfKhEVccDGdmjZKsGGLkwDD0eAiHE0b 0KWptPwIZldQFAHdrlYlFIAE03Mo2cagvfE4yyWSkihcz1KNS00eCyNu7uePhiBgUNiM DySKzV/8PqMqFu9WRnq6mm2G+SVIboqIcGqE+gTOFhWiSuPgamwt7wBEugsKrjFVgQg2 /1bw== X-Gm-Message-State: AOAM532WZ/oQfVnjwhbaX6lcSnzl2l2CjEuGByP+KGOzOjwrw/udewAA U7MHjG+H3iYSW12D7u1nhuedpv5vxTwISQ== X-Google-Smtp-Source: ABdhPJwZDajta8Ijmm/lCslZedmoETXeqeRTluImdhNWoeT2xtNAspYcLlrdJB6w+XBoRR3kiVe3QA== X-Received: by 2002:a05:6512:1086:: with SMTP id j6mr17394682lfg.375.1643128188139; Tue, 25 Jan 2022 08:29:48 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:47 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 03/12] tee: add tee_shm_alloc_user_buf() Date: Tue, 25 Jan 2022 17:29:29 +0100 Message-Id: <20220125162938.838382-4-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Adds a new function tee_shm_alloc_user_buf() or user mode allocations, replacing passing the flags TEE_SHM_MAPPED | TEE_SHM_DMA_BUF to tee_shm_alloc(). Signed-off-by: Jens Wiklander --- drivers/tee/tee_core.c | 2 +- drivers/tee/tee_private.h | 2 ++ drivers/tee/tee_shm.c | 17 +++++++++++++++++ drivers/tee/tee_shm_pool.c | 2 +- include/linux/tee_drv.h | 2 +- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index 3fc426dad2df..a15812baaeb1 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -297,7 +297,7 @@ static int tee_ioctl_shm_alloc(struct tee_context *ctx, if (data.flags) return -EINVAL; =20 - shm =3D tee_shm_alloc(ctx, data.size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); + shm =3D tee_shm_alloc_user_buf(ctx, data.size); if (IS_ERR(shm)) return PTR_ERR(shm); =20 diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h index e55204df31ce..e09c8aa5d967 100644 --- a/drivers/tee/tee_private.h +++ b/drivers/tee/tee_private.h @@ -68,4 +68,6 @@ void tee_device_put(struct tee_device *teedev); void teedev_ctx_get(struct tee_context *ctx); void teedev_ctx_put(struct tee_context *ctx); =20 +struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t siz= e); + #endif /*TEE_PRIVATE_H*/ diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 499fccba3d74..7e7e762fc1de 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -127,6 +127,23 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx,= size_t size, u32 flags) } EXPORT_SYMBOL_GPL(tee_shm_alloc); =20 +/** + * tee_shm_alloc_user_buf() - Allocate shared memory for user space + * @ctx: Context that allocates the shared memory + * @size: Requested size of shared memory + * + * Memory allocated as user space shared memory is automatically freed when + * the TEE file pointer is closed. The primary usage of this function is + * when the TEE driver doesn't support registering ordinary user space + * memory. + * + * @returns a pointer to 'struct tee_shm' + */ +struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t siz= e) +{ + return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); +} + /** * tee_shm_alloc_kernel_buf() - Allocate shared memory for kernel buffer * @ctx: Context that allocates the shared memory diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c index a9f9d50fd181..0e460347138a 100644 --- a/drivers/tee/tee_shm_pool.c +++ b/drivers/tee/tee_shm_pool.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2015, Linaro Limited + * Copyright (c) 2015, 2017, 2022 Linaro Limited */ #include #include diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index 6b0f0d01ebdf..975500b2553e 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2015-2016, Linaro Limited + * Copyright (c) 2015-2022 Linaro Limited */ =20 #ifndef __TEE_DRV_H --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 6DE92C433EF for ; Tue, 25 Jan 2022 16:34:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1583786AbiAYQd5 (ORCPT ); Tue, 25 Jan 2022 11:33:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37364 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1380265AbiAYQ3x (ORCPT ); Tue, 25 Jan 2022 11:29:53 -0500 Received: from mail-lf1-x12e.google.com (mail-lf1-x12e.google.com [IPv6:2a00:1450:4864:20::12e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C02E5C06173D for ; Tue, 25 Jan 2022 08:29:51 -0800 (PST) Received: by mail-lf1-x12e.google.com with SMTP id z19so21134767lfq.13 for ; Tue, 25 Jan 2022 08:29:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mk0QTrWYNIqMlNlaNA65JGxOsyQCSgimX0tBW3zJXss=; b=LmmgL/1aURYVTtEYN5pNx73DgANsAbgEUxs1+wrS3ZJ5TOO73SvgiinlxiWVSFEqlP s/qKLYcLnZY8ubW03RsYu7Ah7znaex874EvRzoMUIP/IVC7oK01rIue64kjL5RprYcz/ EiSYIeKDIYNZe6f3QalvKUnLgC7SDdZwqFdb6/jVazLafsJd9kZDHpuGsKh57/MynfrA 4L/0u9Bf4IYecPz2WzYcxMsWiwxDrQUJTtmRzBBoo3dAOFk3uh6WFm5g5rHfVqJ/Iley c0orredreKRB9fHns7UVnW3HUPvDWxAOb79K5R53W/vd3YszyE8kJolNOt4BA91Np3QC Mxhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mk0QTrWYNIqMlNlaNA65JGxOsyQCSgimX0tBW3zJXss=; b=DR5El9hW62wvUNPIRz7FjEuJ8X3/VYl19HVAM79LUW4sBZhkDc+SA2jfjnVSap3YiH eUY+VQ3NkgG1PRtS8AJ6zSWtFV7ZPb3f3kkovmg8eRTIYpp11Hmlu2onK+81IkWutWHW nt7glSMI5TF5TtB8cI6Ls9BFKaaA1UsB5TTQsPiH9KunAkTELxDU/iTgO4vcd00AuNR4 P5+m+tZEuY40iVNWSFbQvPdpMy91c4VQykweMQ5eS3op/aYKgl7xKlc47EHxDNGP94O9 ipQrjSpjRN2q9X8UZqaxmEap5XqRPoWwH7msMooAI6hlrC6rS5TMLHNpnABSeX8d/+59 Oamw== X-Gm-Message-State: AOAM530muYS7wdvAp/4rEslxWJW1tBI5XMwNhpbk4N5W7Zt0ocSUSpc3 F+T1V18mYMaL7+y3HuBCrZDsnJuikKTY7Q== X-Google-Smtp-Source: ABdhPJxFFP7xggwp2DMnmKWSUS61mQ19sNA/YqSj9l8XkcG1gO03OOlHGYlIDBM2BAu9wuFMN+Z8OQ== X-Received: by 2002:a05:6512:3085:: with SMTP id z5mr807533lfd.216.1643128189296; Tue, 25 Jan 2022 08:29:49 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:48 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 04/12] tee: simplify shm pool handling Date: Tue, 25 Jan 2022 17:29:30 +0100 Message-Id: <20220125162938.838382-5-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Replaces the shared memory pool based on two pools with a single pool. The alloc() function pointer in struct tee_shm_pool_ops gets another parameter, align. This makes it possible to make less than page aligned allocations from the optional reserved shared memory pool while still making user space allocations page aligned. With in practice unchanged behaviour using only a single pool for bookkeeping. The allocation algorithm in the static OP-TEE shared memory pool is changed from best-fit to first-fit since only the latter supports an alignment parameter. The best-fit algorithm was previously the default choice and not a conscious one. The optee and amdtee drivers are updated as needed to work with this changed pool handling. This also removes OPTEE_SHM_NUM_PRIV_PAGES which becomes obsolete with this change as the private pages can be mixed with the payload pages. Signed-off-by: Jens Wiklander --- drivers/tee/amdtee/shm_pool.c | 55 +++++----------- drivers/tee/optee/Kconfig | 8 --- drivers/tee/optee/core.c | 11 ++-- drivers/tee/optee/ffa_abi.c | 55 ++++------------ drivers/tee/optee/optee_private.h | 4 +- drivers/tee/optee/smc_abi.c | 100 ++++++---------------------- drivers/tee/tee_private.h | 11 ---- drivers/tee/tee_shm.c | 29 ++++----- drivers/tee/tee_shm_pool.c | 104 ++++++++++-------------------- include/linux/tee_drv.h | 58 ++++++----------- 10 files changed, 126 insertions(+), 309 deletions(-) diff --git a/drivers/tee/amdtee/shm_pool.c b/drivers/tee/amdtee/shm_pool.c index 065854e2db18..f87f96a291c9 100644 --- a/drivers/tee/amdtee/shm_pool.c +++ b/drivers/tee/amdtee/shm_pool.c @@ -8,13 +8,17 @@ #include #include "amdtee_private.h" =20 -static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, struct tee_shm *s= hm, - size_t size) +static int pool_op_alloc(struct tee_shm_pool *pool, struct tee_shm *shm, + size_t size, size_t align) { unsigned int order =3D get_order(size); unsigned long va; int rc; =20 + /* + * Ignore alignment since this is already going to be page aligned + * and there's no need for any larger alignment. + */ va =3D __get_free_pages(GFP_KERNEL | __GFP_ZERO, order); if (!va) return -ENOMEM; @@ -34,7 +38,7 @@ static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, = struct tee_shm *shm, return 0; } =20 -static void pool_op_free(struct tee_shm_pool_mgr *poolm, struct tee_shm *s= hm) +static void pool_op_free(struct tee_shm_pool *pool, struct tee_shm *shm) { /* Unmap the shared memory from TEE */ amdtee_unmap_shmem(shm); @@ -42,52 +46,25 @@ static void pool_op_free(struct tee_shm_pool_mgr *poolm= , struct tee_shm *shm) shm->kaddr =3D NULL; } =20 -static void pool_op_destroy_poolmgr(struct tee_shm_pool_mgr *poolm) +static void pool_op_destroy_pool(struct tee_shm_pool *pool) { - kfree(poolm); + kfree(pool); } =20 -static const struct tee_shm_pool_mgr_ops pool_ops =3D { +static const struct tee_shm_pool_ops pool_ops =3D { .alloc =3D pool_op_alloc, .free =3D pool_op_free, - .destroy_poolmgr =3D pool_op_destroy_poolmgr, + .destroy_pool =3D pool_op_destroy_pool, }; =20 -static struct tee_shm_pool_mgr *pool_mem_mgr_alloc(void) -{ - struct tee_shm_pool_mgr *mgr =3D kzalloc(sizeof(*mgr), GFP_KERNEL); - - if (!mgr) - return ERR_PTR(-ENOMEM); - - mgr->ops =3D &pool_ops; - - return mgr; -} - struct tee_shm_pool *amdtee_config_shm(void) { - struct tee_shm_pool_mgr *priv_mgr; - struct tee_shm_pool_mgr *dmabuf_mgr; - void *rc; + struct tee_shm_pool *pool =3D kzalloc(sizeof(*pool), GFP_KERNEL); =20 - rc =3D pool_mem_mgr_alloc(); - if (IS_ERR(rc)) - return rc; - priv_mgr =3D rc; - - rc =3D pool_mem_mgr_alloc(); - if (IS_ERR(rc)) { - tee_shm_pool_mgr_destroy(priv_mgr); - return rc; - } - dmabuf_mgr =3D rc; + if (!pool) + return ERR_PTR(-ENOMEM); =20 - rc =3D tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); - if (IS_ERR(rc)) { - tee_shm_pool_mgr_destroy(priv_mgr); - tee_shm_pool_mgr_destroy(dmabuf_mgr); - } + pool->ops =3D &pool_ops; =20 - return rc; + return pool; } diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig index 3ca71e3812ed..f121c224e682 100644 --- a/drivers/tee/optee/Kconfig +++ b/drivers/tee/optee/Kconfig @@ -7,11 +7,3 @@ config OPTEE help This implements the OP-TEE Trusted Execution Environment (TEE) driver. - -config OPTEE_SHM_NUM_PRIV_PAGES - int "Private Shared Memory Pages" - default 1 - depends on OPTEE - help - This sets the number of private shared memory pages to be - used by OP-TEE TEE driver. diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 1ca320885fad..2a369e346b85 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -18,8 +18,8 @@ #include #include "optee_private.h" =20 -int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *poolm, - struct tee_shm *shm, size_t size, +int optee_pool_op_alloc_helper(struct tee_shm_pool *pool, struct tee_shm *= shm, + size_t size, size_t align, int (*shm_register)(struct tee_context *ctx, struct tee_shm *shm, struct page **pages, @@ -30,6 +30,10 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *= poolm, struct page *page; int rc =3D 0; =20 + /* + * Ignore alignment since this is already going to be page aligned + * and there's no need for any larger alignment. + */ page =3D alloc_pages(GFP_KERNEL | __GFP_ZERO, order); if (!page) return -ENOMEM; @@ -51,7 +55,6 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *p= oolm, for (i =3D 0; i < nr_pages; i++) pages[i] =3D page + i; =20 - shm->flags |=3D TEE_SHM_REGISTER; rc =3D shm_register(shm->ctx, shm, pages, nr_pages, (unsigned long)shm->kaddr); kfree(pages); @@ -62,7 +65,7 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *p= oolm, return 0; =20 err: - __free_pages(page, order); + free_pages((unsigned long)shm->kaddr, order); return rc; } =20 diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 20a1b1a3d965..e690d9420966 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -369,14 +369,14 @@ static int optee_ffa_shm_unregister_supp(struct tee_c= ontext *ctx, * The main function is optee_ffa_shm_pool_alloc_pages(). */ =20 -static int pool_ffa_op_alloc(struct tee_shm_pool_mgr *poolm, - struct tee_shm *shm, size_t size) +static int pool_ffa_op_alloc(struct tee_shm_pool *pool, + struct tee_shm *shm, size_t size, size_t align) { - return optee_pool_op_alloc_helper(poolm, shm, size, + return optee_pool_op_alloc_helper(pool, shm, size, align, optee_ffa_shm_register); } =20 -static void pool_ffa_op_free(struct tee_shm_pool_mgr *poolm, +static void pool_ffa_op_free(struct tee_shm_pool *pool, struct tee_shm *shm) { optee_ffa_shm_unregister(shm->ctx, shm); @@ -384,15 +384,15 @@ static void pool_ffa_op_free(struct tee_shm_pool_mgr = *poolm, shm->kaddr =3D NULL; } =20 -static void pool_ffa_op_destroy_poolmgr(struct tee_shm_pool_mgr *poolm) +static void pool_ffa_op_destroy_pool(struct tee_shm_pool *pool) { - kfree(poolm); + kfree(pool); } =20 -static const struct tee_shm_pool_mgr_ops pool_ffa_ops =3D { +static const struct tee_shm_pool_ops pool_ffa_ops =3D { .alloc =3D pool_ffa_op_alloc, .free =3D pool_ffa_op_free, - .destroy_poolmgr =3D pool_ffa_op_destroy_poolmgr, + .destroy_pool =3D pool_ffa_op_destroy_pool, }; =20 /** @@ -401,16 +401,16 @@ static const struct tee_shm_pool_mgr_ops pool_ffa_ops= =3D { * This pool is used with OP-TEE over FF-A. In this case command buffers * and such are allocated from kernel's own memory. */ -static struct tee_shm_pool_mgr *optee_ffa_shm_pool_alloc_pages(void) +static struct tee_shm_pool *optee_ffa_shm_pool_alloc_pages(void) { - struct tee_shm_pool_mgr *mgr =3D kzalloc(sizeof(*mgr), GFP_KERNEL); + struct tee_shm_pool *pool =3D kzalloc(sizeof(*pool), GFP_KERNEL); =20 - if (!mgr) + if (!pool) return ERR_PTR(-ENOMEM); =20 - mgr->ops =3D &pool_ffa_ops; + pool->ops =3D &pool_ffa_ops; =20 - return mgr; + return pool; } =20 /* @@ -691,33 +691,6 @@ static bool optee_ffa_exchange_caps(struct ffa_device = *ffa_dev, return true; } =20 -static struct tee_shm_pool *optee_ffa_config_dyn_shm(void) -{ - struct tee_shm_pool_mgr *priv_mgr; - struct tee_shm_pool_mgr *dmabuf_mgr; - void *rc; - - rc =3D optee_ffa_shm_pool_alloc_pages(); - if (IS_ERR(rc)) - return rc; - priv_mgr =3D rc; - - rc =3D optee_ffa_shm_pool_alloc_pages(); - if (IS_ERR(rc)) { - tee_shm_pool_mgr_destroy(priv_mgr); - return rc; - } - dmabuf_mgr =3D rc; - - rc =3D tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); - if (IS_ERR(rc)) { - tee_shm_pool_mgr_destroy(priv_mgr); - tee_shm_pool_mgr_destroy(dmabuf_mgr); - } - - return rc; -} - static void optee_ffa_get_version(struct tee_device *teedev, struct tee_ioctl_version_data *vers) { @@ -813,7 +786,7 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) if (!optee) return -ENOMEM; =20 - optee->pool =3D optee_ffa_config_dyn_shm(); + optee->pool =3D optee_ffa_shm_pool_alloc_pages(); if (IS_ERR(optee->pool)) { rc =3D PTR_ERR(optee->pool); optee->pool =3D NULL; diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_pr= ivate.h index 46f74ab07c7e..df2450921464 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -228,8 +228,8 @@ int optee_cancel_req(struct tee_context *ctx, u32 cance= l_id, u32 session); int optee_enumerate_devices(u32 func); void optee_unregister_devices(void); =20 -int optee_pool_op_alloc_helper(struct tee_shm_pool_mgr *poolm, - struct tee_shm *shm, size_t size, +int optee_pool_op_alloc_helper(struct tee_shm_pool *pool, struct tee_shm *= shm, + size_t size, size_t align, int (*shm_register)(struct tee_context *ctx, struct tee_shm *shm, struct page **pages, diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index 449d6a72d289..b679037ea794 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -42,8 +42,6 @@ * 6. Driver initialization. */ =20 -#define OPTEE_SHM_NUM_PRIV_PAGES CONFIG_OPTEE_SHM_NUM_PRIV_PAGES - /* * 1. Convert between struct tee_param and struct optee_msg_param * @@ -532,20 +530,21 @@ static int optee_shm_unregister_supp(struct tee_conte= xt *ctx, * The main function is optee_shm_pool_alloc_pages(). */ =20 -static int pool_op_alloc(struct tee_shm_pool_mgr *poolm, - struct tee_shm *shm, size_t size) +static int pool_op_alloc(struct tee_shm_pool *pool, + struct tee_shm *shm, size_t size, size_t align) { /* * Shared memory private to the OP-TEE driver doesn't need * to be registered with OP-TEE. */ if (shm->flags & TEE_SHM_PRIV) - return optee_pool_op_alloc_helper(poolm, shm, size, NULL); + return optee_pool_op_alloc_helper(pool, shm, size, align, NULL); =20 - return optee_pool_op_alloc_helper(poolm, shm, size, optee_shm_register); + return optee_pool_op_alloc_helper(pool, shm, size, align, + optee_shm_register); } =20 -static void pool_op_free(struct tee_shm_pool_mgr *poolm, +static void pool_op_free(struct tee_shm_pool *pool, struct tee_shm *shm) { if (!(shm->flags & TEE_SHM_PRIV)) @@ -555,15 +554,15 @@ static void pool_op_free(struct tee_shm_pool_mgr *poo= lm, shm->kaddr =3D NULL; } =20 -static void pool_op_destroy_poolmgr(struct tee_shm_pool_mgr *poolm) +static void pool_op_destroy_pool(struct tee_shm_pool *pool) { - kfree(poolm); + kfree(pool); } =20 -static const struct tee_shm_pool_mgr_ops pool_ops =3D { +static const struct tee_shm_pool_ops pool_ops =3D { .alloc =3D pool_op_alloc, .free =3D pool_op_free, - .destroy_poolmgr =3D pool_op_destroy_poolmgr, + .destroy_pool =3D pool_op_destroy_pool, }; =20 /** @@ -572,16 +571,16 @@ static const struct tee_shm_pool_mgr_ops pool_ops =3D= { * This pool is used when OP-TEE supports dymanic SHM. In this case * command buffers and such are allocated from kernel's own memory. */ -static struct tee_shm_pool_mgr *optee_shm_pool_alloc_pages(void) +static struct tee_shm_pool *optee_shm_pool_alloc_pages(void) { - struct tee_shm_pool_mgr *mgr =3D kzalloc(sizeof(*mgr), GFP_KERNEL); + struct tee_shm_pool *pool =3D kzalloc(sizeof(*pool), GFP_KERNEL); =20 - if (!mgr) + if (!pool) return ERR_PTR(-ENOMEM); =20 - mgr->ops =3D &pool_ops; + pool->ops =3D &pool_ops; =20 - return mgr; + return pool; } =20 /* @@ -1174,33 +1173,6 @@ static bool optee_msg_exchange_capabilities(optee_in= voke_fn *invoke_fn, return true; } =20 -static struct tee_shm_pool *optee_config_dyn_shm(void) -{ - struct tee_shm_pool_mgr *priv_mgr; - struct tee_shm_pool_mgr *dmabuf_mgr; - void *rc; - - rc =3D optee_shm_pool_alloc_pages(); - if (IS_ERR(rc)) - return rc; - priv_mgr =3D rc; - - rc =3D optee_shm_pool_alloc_pages(); - if (IS_ERR(rc)) { - tee_shm_pool_mgr_destroy(priv_mgr); - return rc; - } - dmabuf_mgr =3D rc; - - rc =3D tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); - if (IS_ERR(rc)) { - tee_shm_pool_mgr_destroy(priv_mgr); - tee_shm_pool_mgr_destroy(dmabuf_mgr); - } - - return rc; -} - static struct tee_shm_pool * optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_sh= m) { @@ -1214,10 +1186,7 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn= , void **memremaped_shm) phys_addr_t begin; phys_addr_t end; void *va; - struct tee_shm_pool_mgr *priv_mgr; - struct tee_shm_pool_mgr *dmabuf_mgr; void *rc; - const int sz =3D OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; =20 invoke_fn(OPTEE_SMC_GET_SHM_CONFIG, 0, 0, 0, 0, 0, 0, 0, &res.smccc); if (res.result.status !=3D OPTEE_SMC_RETURN_OK) { @@ -1235,11 +1204,6 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn= , void **memremaped_shm) paddr =3D begin; size =3D end - begin; =20 - if (size < 2 * OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE) { - pr_err("too small shared memory area\n"); - return ERR_PTR(-EINVAL); - } - va =3D memremap(paddr, size, MEMREMAP_WB); if (!va) { pr_err("shared memory ioremap failed\n"); @@ -1247,35 +1211,13 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_f= n, void **memremaped_shm) } vaddr =3D (unsigned long)va; =20 - rc =3D tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, sz, - 3 /* 8 bytes aligned */); - if (IS_ERR(rc)) - goto err_memunmap; - priv_mgr =3D rc; - - vaddr +=3D sz; - paddr +=3D sz; - size -=3D sz; - - rc =3D tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, size, PAGE_SHIFT); + rc =3D tee_shm_pool_alloc_res_mem(vaddr, paddr, size, + 9 /* 512 bytes aligned */); if (IS_ERR(rc)) - goto err_free_priv_mgr; - dmabuf_mgr =3D rc; - - rc =3D tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); - if (IS_ERR(rc)) - goto err_free_dmabuf_mgr; - - *memremaped_shm =3D va; - - return rc; + memunmap(va); + else + *memremaped_shm =3D va; =20 -err_free_dmabuf_mgr: - tee_shm_pool_mgr_destroy(dmabuf_mgr); -err_free_priv_mgr: - tee_shm_pool_mgr_destroy(priv_mgr); -err_memunmap: - memunmap(va); return rc; } =20 @@ -1396,7 +1338,7 @@ static int optee_probe(struct platform_device *pdev) * Try to use dynamic shared memory if possible */ if (sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) - pool =3D optee_config_dyn_shm(); + pool =3D optee_shm_pool_alloc_pages(); =20 /* * If dynamic shared memory is not available or failed - try static one diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h index e09c8aa5d967..7265f47c6d8e 100644 --- a/drivers/tee/tee_private.h +++ b/drivers/tee/tee_private.h @@ -12,17 +12,6 @@ #include #include =20 -/** - * struct tee_shm_pool - shared memory pool - * @private_mgr: pool manager for shared memory only between kernel - * and secure world - * @dma_buf_mgr: pool manager for shared memory exported to user space - */ -struct tee_shm_pool { - struct tee_shm_pool_mgr *private_mgr; - struct tee_shm_pool_mgr *dma_buf_mgr; -}; - #define TEE_DEVICE_FLAG_REGISTERED 0x1 #define TEE_MAX_DEV_NAME_LEN 32 =20 diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 7e7e762fc1de..f0a9cccd2f2c 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -31,14 +31,7 @@ static void release_registered_pages(struct tee_shm *shm) static void tee_shm_release(struct tee_device *teedev, struct tee_shm *shm) { if (shm->flags & TEE_SHM_POOL) { - struct tee_shm_pool_mgr *poolm; - - if (shm->flags & TEE_SHM_DMA_BUF) - poolm =3D teedev->pool->dma_buf_mgr; - else - poolm =3D teedev->pool->private_mgr; - - poolm->ops->free(poolm, shm); + teedev->pool->ops->free(teedev->pool, shm); } else if (shm->flags & TEE_SHM_REGISTER) { int rc =3D teedev->desc->ops->shm_unregister(shm->ctx, shm); =20 @@ -59,8 +52,8 @@ static void tee_shm_release(struct tee_device *teedev, st= ruct tee_shm *shm) struct tee_shm *tee_shm_alloc(struct tee_context *ctx, size_t size, u32 fl= ags) { struct tee_device *teedev =3D ctx->teedev; - struct tee_shm_pool_mgr *poolm =3D NULL; struct tee_shm *shm; + size_t align; void *ret; int rc; =20 @@ -93,12 +86,18 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, = size_t size, u32 flags) refcount_set(&shm->refcount, 1); shm->flags =3D flags | TEE_SHM_POOL; shm->ctx =3D ctx; - if (flags & TEE_SHM_DMA_BUF) - poolm =3D teedev->pool->dma_buf_mgr; - else - poolm =3D teedev->pool->private_mgr; + if (flags & TEE_SHM_DMA_BUF) { + align =3D PAGE_SIZE; + /* + * Request to register the shm in the pool allocator below + * if supported. + */ + shm->flags |=3D TEE_SHM_REGISTER; + } else { + align =3D 2 * sizeof(long); + } =20 - rc =3D poolm->ops->alloc(poolm, shm, size); + rc =3D teedev->pool->ops->alloc(teedev->pool, shm, size, align); if (rc) { ret =3D ERR_PTR(rc); goto err_kfree; @@ -118,7 +117,7 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, = size_t size, u32 flags) =20 return shm; err_pool_free: - poolm->ops->free(poolm, shm); + teedev->pool->ops->free(teedev->pool, shm); err_kfree: kfree(shm); err_dev_put: diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c index 0e460347138a..71e0f8ae69aa 100644 --- a/drivers/tee/tee_shm_pool.c +++ b/drivers/tee/tee_shm_pool.c @@ -9,14 +9,16 @@ #include #include "tee_private.h" =20 -static int pool_op_gen_alloc(struct tee_shm_pool_mgr *poolm, - struct tee_shm *shm, size_t size) +static int pool_op_gen_alloc(struct tee_shm_pool *pool, struct tee_shm *sh= m, + size_t size, size_t align) { unsigned long va; - struct gen_pool *genpool =3D poolm->private_data; - size_t s =3D roundup(size, 1 << genpool->min_alloc_order); + struct gen_pool *genpool =3D pool->private_data; + size_t a =3D max_t(size_t, align, BIT(genpool->min_alloc_order)); + struct genpool_data_align data =3D { .align =3D a }; + size_t s =3D roundup(size, a); =20 - va =3D gen_pool_alloc(genpool, s); + va =3D gen_pool_alloc_algo(genpool, s, gen_pool_first_fit_align, &data); if (!va) return -ENOMEM; =20 @@ -24,107 +26,67 @@ static int pool_op_gen_alloc(struct tee_shm_pool_mgr *= poolm, shm->kaddr =3D (void *)va; shm->paddr =3D gen_pool_virt_to_phys(genpool, va); shm->size =3D s; + /* + * This is from a static shared memory pool so no need to register + * each chunk, and no need to unregister later either. + */ + shm->flags &=3D ~TEE_SHM_REGISTER; return 0; } =20 -static void pool_op_gen_free(struct tee_shm_pool_mgr *poolm, - struct tee_shm *shm) +static void pool_op_gen_free(struct tee_shm_pool *pool, struct tee_shm *sh= m) { - gen_pool_free(poolm->private_data, (unsigned long)shm->kaddr, + gen_pool_free(pool->private_data, (unsigned long)shm->kaddr, shm->size); shm->kaddr =3D NULL; } =20 -static void pool_op_gen_destroy_poolmgr(struct tee_shm_pool_mgr *poolm) +static void pool_op_gen_destroy_pool(struct tee_shm_pool *pool) { - gen_pool_destroy(poolm->private_data); - kfree(poolm); + gen_pool_destroy(pool->private_data); + kfree(pool); } =20 -static const struct tee_shm_pool_mgr_ops pool_ops_generic =3D { +static const struct tee_shm_pool_ops pool_ops_generic =3D { .alloc =3D pool_op_gen_alloc, .free =3D pool_op_gen_free, - .destroy_poolmgr =3D pool_op_gen_destroy_poolmgr, + .destroy_pool =3D pool_op_gen_destroy_pool, }; =20 -struct tee_shm_pool_mgr *tee_shm_pool_mgr_alloc_res_mem(unsigned long vadd= r, - phys_addr_t paddr, - size_t size, - int min_alloc_order) +struct tee_shm_pool *tee_shm_pool_alloc_res_mem(unsigned long vaddr, + phys_addr_t paddr, size_t size, + int min_alloc_order) { const size_t page_mask =3D PAGE_SIZE - 1; - struct tee_shm_pool_mgr *mgr; + struct tee_shm_pool *pool; int rc; =20 /* Start and end must be page aligned */ if (vaddr & page_mask || paddr & page_mask || size & page_mask) return ERR_PTR(-EINVAL); =20 - mgr =3D kzalloc(sizeof(*mgr), GFP_KERNEL); - if (!mgr) + pool =3D kzalloc(sizeof(*pool), GFP_KERNEL); + if (!pool) return ERR_PTR(-ENOMEM); =20 - mgr->private_data =3D gen_pool_create(min_alloc_order, -1); - if (!mgr->private_data) { + pool->private_data =3D gen_pool_create(min_alloc_order, -1); + if (!pool->private_data) { rc =3D -ENOMEM; goto err; } =20 - gen_pool_set_algo(mgr->private_data, gen_pool_best_fit, NULL); - rc =3D gen_pool_add_virt(mgr->private_data, vaddr, paddr, size, -1); + rc =3D gen_pool_add_virt(pool->private_data, vaddr, paddr, size, -1); if (rc) { - gen_pool_destroy(mgr->private_data); + gen_pool_destroy(pool->private_data); goto err; } =20 - mgr->ops =3D &pool_ops_generic; + pool->ops =3D &pool_ops_generic; =20 - return mgr; + return pool; err: - kfree(mgr); + kfree(pool); =20 return ERR_PTR(rc); } -EXPORT_SYMBOL_GPL(tee_shm_pool_mgr_alloc_res_mem); - -static bool check_mgr_ops(struct tee_shm_pool_mgr *mgr) -{ - return mgr && mgr->ops && mgr->ops->alloc && mgr->ops->free && - mgr->ops->destroy_poolmgr; -} - -struct tee_shm_pool *tee_shm_pool_alloc(struct tee_shm_pool_mgr *priv_mgr, - struct tee_shm_pool_mgr *dmabuf_mgr) -{ - struct tee_shm_pool *pool; - - if (!check_mgr_ops(priv_mgr) || !check_mgr_ops(dmabuf_mgr)) - return ERR_PTR(-EINVAL); - - pool =3D kzalloc(sizeof(*pool), GFP_KERNEL); - if (!pool) - return ERR_PTR(-ENOMEM); - - pool->private_mgr =3D priv_mgr; - pool->dma_buf_mgr =3D dmabuf_mgr; - - return pool; -} -EXPORT_SYMBOL_GPL(tee_shm_pool_alloc); - -/** - * tee_shm_pool_free() - Free a shared memory pool - * @pool: The shared memory pool to free - * - * There must be no remaining shared memory allocated from this pool when - * this function is called. - */ -void tee_shm_pool_free(struct tee_shm_pool *pool) -{ - if (pool->private_mgr) - tee_shm_pool_mgr_destroy(pool->private_mgr); - if (pool->dma_buf_mgr) - tee_shm_pool_mgr_destroy(pool->dma_buf_mgr); - kfree(pool); -} -EXPORT_SYMBOL_GPL(tee_shm_pool_free); +EXPORT_SYMBOL_GPL(tee_shm_pool_alloc_res_mem); diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index 975500b2553e..ed641dc314bd 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -221,62 +221,39 @@ struct tee_shm { }; =20 /** - * struct tee_shm_pool_mgr - shared memory manager + * struct tee_shm_pool - shared memory pool * @ops: operations * @private_data: private data for the shared memory manager */ -struct tee_shm_pool_mgr { - const struct tee_shm_pool_mgr_ops *ops; +struct tee_shm_pool { + const struct tee_shm_pool_ops *ops; void *private_data; }; =20 /** - * struct tee_shm_pool_mgr_ops - shared memory pool manager operations + * struct tee_shm_pool_ops - shared memory pool operations * @alloc: called when allocating shared memory * @free: called when freeing shared memory - * @destroy_poolmgr: called when destroying the pool manager + * @destroy_pool: called when destroying the pool */ -struct tee_shm_pool_mgr_ops { - int (*alloc)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm, - size_t size); - void (*free)(struct tee_shm_pool_mgr *poolmgr, struct tee_shm *shm); - void (*destroy_poolmgr)(struct tee_shm_pool_mgr *poolmgr); +struct tee_shm_pool_ops { + int (*alloc)(struct tee_shm_pool *pool, struct tee_shm *shm, + size_t size, size_t align); + void (*free)(struct tee_shm_pool *pool, struct tee_shm *shm); + void (*destroy_pool)(struct tee_shm_pool *pool); }; =20 -/** - * tee_shm_pool_alloc() - Create a shared memory pool from shm managers - * @priv_mgr: manager for driver private shared memory allocations - * @dmabuf_mgr: manager for dma-buf shared memory allocations - * - * Allocation with the flag TEE_SHM_DMA_BUF set will use the range supplied - * in @dmabuf, others will use the range provided by @priv. - * - * @returns pointer to a 'struct tee_shm_pool' or an ERR_PTR on failure. - */ -struct tee_shm_pool *tee_shm_pool_alloc(struct tee_shm_pool_mgr *priv_mgr, - struct tee_shm_pool_mgr *dmabuf_mgr); - /* - * tee_shm_pool_mgr_alloc_res_mem() - Create a shm manager for reserved - * memory + * tee_shm_pool_alloc_res_mem() - Create a shm manager for reserved memory * @vaddr: Virtual address of start of pool * @paddr: Physical address of start of pool * @size: Size in bytes of the pool * - * @returns pointer to a 'struct tee_shm_pool_mgr' or an ERR_PTR on failur= e. - */ -struct tee_shm_pool_mgr *tee_shm_pool_mgr_alloc_res_mem(unsigned long vadd= r, - phys_addr_t paddr, - size_t size, - int min_alloc_order); - -/** - * tee_shm_pool_mgr_destroy() - Free a shared memory manager + * @returns pointer to a 'struct tee_shm_pool' or an ERR_PTR on failure. */ -static inline void tee_shm_pool_mgr_destroy(struct tee_shm_pool_mgr *poolm) -{ - poolm->ops->destroy_poolmgr(poolm); -} +struct tee_shm_pool *tee_shm_pool_alloc_res_mem(unsigned long vaddr, + phys_addr_t paddr, size_t size, + int min_alloc_order); =20 /** * tee_shm_pool_free() - Free a shared memory pool @@ -285,7 +262,10 @@ static inline void tee_shm_pool_mgr_destroy(struct tee= _shm_pool_mgr *poolm) * The must be no remaining shared memory allocated from this pool when * this function is called. */ -void tee_shm_pool_free(struct tee_shm_pool *pool); +static inline void tee_shm_pool_free(struct tee_shm_pool *pool) +{ + pool->ops->destroy_pool(pool); +} =20 /** * tee_get_drvdata() - Return driver_data pointer --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 1438FC4332F for ; Tue, 25 Jan 2022 16:34:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242282AbiAYQeK (ORCPT ); Tue, 25 Jan 2022 11:34:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37366 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1380282AbiAYQ3x (ORCPT ); Tue, 25 Jan 2022 11:29:53 -0500 Received: from mail-lj1-x22d.google.com (mail-lj1-x22d.google.com [IPv6:2a00:1450:4864:20::22d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A5B3BC06173E for ; Tue, 25 Jan 2022 08:29:52 -0800 (PST) Received: by mail-lj1-x22d.google.com with SMTP id q22so8893035ljh.7 for ; Tue, 25 Jan 2022 08:29:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7OJvZ/1+oVZM4u11cvDJu33YiBIIXPFfGRcBH5BhNZ4=; b=v5wLDG77TJkX9L2mwV9uCpyE2N0JzypvTsJKt8SdV8BtXir7wn+gJcXAJ15ZDeax6l UjfgmsYPcuBixkupTKyUY6F1FpeejHkGwWuWeVIZJ3W/6iNnZlg0UBifSlqFW162PY2M CTL9Q/XI34BTQJM8fsm2y7HjuoDPUTFbfJWLqI4aH20xoPnWAxK6BvL87OVa7biZq0j9 aKCoCXcsCCyTPrvLsIkq9HHAWdgYHutvnXVHDPgzTvPv2jUZfy4vcljRt9J4vYp5qRFI gKG40N+DKfX4EoImGGAvewF+pydxvtQU4oxy766oa8TGy+f1WjeNS767jyoO8hP3l7cx NfgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7OJvZ/1+oVZM4u11cvDJu33YiBIIXPFfGRcBH5BhNZ4=; b=T2yQgExLTfWOTLiTqKiwsp2gMXg/PtdhrtWkAOVwee2GvIFGiD2bn68daAEhIVY+wK oO7ImA0tq31a4sTNLyBm8MPROcMNSs9FouQToEKkPKkpnIa91qBjXRY1d9/dCpiOVYns L5zvD4sIE1T7TEwPUy68g1aQfsFsuzBkuRP4gWcpP39onmTf/elU6hCBb7L+shAafTH2 CIkuLKYs0cLCSYIKl1NjrrUcYAGeOi35tYsyl/+UvzYHUUUjK84cU7aHfhkhnWNAxMeP IAKtI9GKWEJk/P4vny2XjrayQbK5ewxAZSVlI2wfT1Nf5hcg73gwywMoL3lVC3aG9Fir ORTA== X-Gm-Message-State: AOAM532brtKKLXGromttgAXAnsfFLY9ZvXf5Gm9LOU2PPW+wp9K+eefN IRqXfyIvlN0oNaFeoLtO14bWNFBDc3julg== X-Google-Smtp-Source: ABdhPJzM7AwcJGXeaQ9BVAq6HgK54LhiAusxwCOoM1Tp+J2s6CIDvW9FjWE1ffqGCDv4uoBjlfBgjQ== X-Received: by 2002:a2e:b557:: with SMTP id a23mr6187746ljn.294.1643128190616; Tue, 25 Jan 2022 08:29:50 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:49 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 05/12] tee: replace tee_shm_alloc() Date: Tue, 25 Jan 2022 17:29:31 +0100 Message-Id: <20220125162938.838382-6-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" tee_shm_alloc() is replaced by three new functions, tee_shm_alloc_user_buf() - for user mode allocations, replacing passing the flags TEE_SHM_MAPPED | TEE_SHM_DMA_BUF tee_shm_alloc_kernel_buf() - for kernel mode allocations, slightly optimized compared to using the flags TEE_SHM_MAPPED | TEE_SHM_DMA_BUF. tee_shm_alloc_priv_kernel_buf() - primarily for TEE driver internal use. This also makes the interface easier to use as we can get rid of the somewhat hard to use flags parameter. The TEE subsystem and the TEE drivers are updated to use the new functions instead. Signed-off-by: Jens Wiklander --- drivers/tee/optee/call.c | 2 +- drivers/tee/optee/device.c | 5 +- drivers/tee/optee/ffa_abi.c | 3 +- drivers/tee/optee/smc_abi.c | 5 +- drivers/tee/tee_shm.c | 108 +++++++++++++++++++++++------------- include/linux/tee_drv.h | 16 +----- 6 files changed, 75 insertions(+), 64 deletions(-) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index b25cc1fac945..bd49ec934060 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -120,7 +120,7 @@ struct tee_shm *optee_get_msg_arg(struct tee_context *c= tx, size_t num_params, if (optee->rpc_arg_count) sz +=3D OPTEE_MSG_GET_ARG_SIZE(optee->rpc_arg_count); =20 - shm =3D tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED | TEE_SHM_PRIV); + shm =3D tee_shm_alloc_priv_buf(ctx, sz); if (IS_ERR(shm)) return shm; =20 diff --git a/drivers/tee/optee/device.c b/drivers/tee/optee/device.c index 128a2d2a50a1..f3947be13e2e 100644 --- a/drivers/tee/optee/device.c +++ b/drivers/tee/optee/device.c @@ -121,10 +121,9 @@ static int __optee_enumerate_devices(u32 func) if (rc < 0 || !shm_size) goto out_sess; =20 - device_shm =3D tee_shm_alloc(ctx, shm_size, - TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); + device_shm =3D tee_shm_alloc_kernel_buf(ctx, shm_size); if (IS_ERR(device_shm)) { - pr_err("tee_shm_alloc failed\n"); + pr_err("tee_shm_alloc_kernel_buf failed\n"); rc =3D PTR_ERR(device_shm); goto out_sess; } diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index e690d9420966..d71880ede6d6 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -439,8 +439,7 @@ static void handle_ffa_rpc_func_cmd_shm_alloc(struct te= e_context *ctx, shm =3D optee_rpc_cmd_alloc_suppl(ctx, arg->params[0].u.value.b); break; case OPTEE_RPC_SHM_TYPE_KERNEL: - shm =3D tee_shm_alloc(ctx, arg->params[0].u.value.b, - TEE_SHM_MAPPED | TEE_SHM_PRIV); + shm =3D tee_shm_alloc_priv_buf(ctx, arg->params[0].u.value.b); break; default: arg->ret =3D TEEC_ERROR_BAD_PARAMETERS; diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index b679037ea794..66d5d1b56b95 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -650,7 +650,7 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_co= ntext *ctx, shm =3D optee_rpc_cmd_alloc_suppl(ctx, sz); break; case OPTEE_RPC_SHM_TYPE_KERNEL: - shm =3D tee_shm_alloc(ctx, sz, TEE_SHM_MAPPED | TEE_SHM_PRIV); + shm =3D tee_shm_alloc_priv_buf(ctx, sz); break; default: arg->ret =3D TEEC_ERROR_BAD_PARAMETERS; @@ -775,8 +775,7 @@ static void optee_handle_rpc(struct tee_context *ctx, =20 switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) { case OPTEE_SMC_RPC_FUNC_ALLOC: - shm =3D tee_shm_alloc(ctx, param->a1, - TEE_SHM_MAPPED | TEE_SHM_PRIV); + shm =3D tee_shm_alloc_priv_buf(ctx, param->a1); if (!IS_ERR(shm) && !tee_shm_get_pa(shm, 0, &pa)) { reg_pair_from_64(¶m->a1, ¶m->a2, pa); reg_pair_from_64(¶m->a4, ¶m->a5, diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index f0a9cccd2f2c..dc02afd7b5c9 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -49,25 +49,14 @@ static void tee_shm_release(struct tee_device *teedev, = struct tee_shm *shm) tee_device_put(teedev); } =20 -struct tee_shm *tee_shm_alloc(struct tee_context *ctx, size_t size, u32 fl= ags) +static struct tee_shm *shm_alloc_helper(struct tee_context *ctx, size_t si= ze, + size_t align, u32 flags, int id) { struct tee_device *teedev =3D ctx->teedev; struct tee_shm *shm; - size_t align; void *ret; int rc; =20 - if (!(flags & TEE_SHM_MAPPED)) { - dev_err(teedev->dev.parent, - "only mapped allocations supported\n"); - return ERR_PTR(-EINVAL); - } - - if ((flags & ~(TEE_SHM_MAPPED | TEE_SHM_DMA_BUF | TEE_SHM_PRIV))) { - dev_err(teedev->dev.parent, "invalid shm flags 0x%x", flags); - return ERR_PTR(-EINVAL); - } - if (!tee_device_get(teedev)) return ERR_PTR(-EINVAL); =20 @@ -84,18 +73,16 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx, = size_t size, u32 flags) } =20 refcount_set(&shm->refcount, 1); - shm->flags =3D flags | TEE_SHM_POOL; + shm->flags =3D flags; + shm->id =3D id; + + /* + * We're assigning this as it is needed if the shm is to be + * registered. If this function returns OK then the caller expected + * to call teedev_ctx_get() or clear shm->ctx in case it's not + * needed any longer. + */ shm->ctx =3D ctx; - if (flags & TEE_SHM_DMA_BUF) { - align =3D PAGE_SIZE; - /* - * Request to register the shm in the pool allocator below - * if supported. - */ - shm->flags |=3D TEE_SHM_REGISTER; - } else { - align =3D 2 * sizeof(long); - } =20 rc =3D teedev->pool->ops->alloc(teedev->pool, shm, size, align); if (rc) { @@ -103,28 +90,14 @@ struct tee_shm *tee_shm_alloc(struct tee_context *ctx,= size_t size, u32 flags) goto err_kfree; } =20 - if (flags & TEE_SHM_DMA_BUF) { - mutex_lock(&teedev->mutex); - shm->id =3D idr_alloc(&teedev->idr, shm, 1, 0, GFP_KERNEL); - mutex_unlock(&teedev->mutex); - if (shm->id < 0) { - ret =3D ERR_PTR(shm->id); - goto err_pool_free; - } - } - teedev_ctx_get(ctx); - return shm; -err_pool_free: - teedev->pool->ops->free(teedev->pool, shm); err_kfree: kfree(shm); err_dev_put: tee_device_put(teedev); return ret; } -EXPORT_SYMBOL_GPL(tee_shm_alloc); =20 /** * tee_shm_alloc_user_buf() - Allocate shared memory for user space @@ -140,7 +113,36 @@ EXPORT_SYMBOL_GPL(tee_shm_alloc); */ struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t siz= e) { - return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); + u32 flags =3D TEE_SHM_MAPPED | TEE_SHM_DMA_BUF | TEE_SHM_REGISTER | + TEE_SHM_POOL; + struct tee_device *teedev =3D ctx->teedev; + struct tee_shm *shm; + void *ret; + int id; + + mutex_lock(&teedev->mutex); + id =3D idr_alloc(&teedev->idr, NULL, 1, 0, GFP_KERNEL); + mutex_unlock(&teedev->mutex); + if (id < 0) + return ERR_PTR(id); + + shm =3D shm_alloc_helper(ctx, size, PAGE_SIZE, flags, id); + if (IS_ERR(shm)) { + mutex_lock(&teedev->mutex); + idr_remove(&teedev->idr, id); + mutex_unlock(&teedev->mutex); + return shm; + } + + mutex_lock(&teedev->mutex); + ret =3D idr_replace(&teedev->idr, shm, id); + mutex_unlock(&teedev->mutex); + if (IS_ERR(ret)) { + tee_shm_free(shm); + return ret; + } + + return shm; } =20 /** @@ -157,10 +159,36 @@ struct tee_shm *tee_shm_alloc_user_buf(struct tee_con= text *ctx, size_t size) */ struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t s= ize) { - return tee_shm_alloc(ctx, size, TEE_SHM_MAPPED); + u32 flags =3D TEE_SHM_MAPPED | TEE_SHM_REGISTER | TEE_SHM_POOL; + + return shm_alloc_helper(ctx, size, PAGE_SIZE, flags, -1); } EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf); =20 +/** + * tee_shm_alloc_priv_buf() - Allocate shared memory for a privatly shared + * kernel buffer + * @ctx: Context that allocates the shared memory + * @size: Requested size of shared memory + * + * This function returns similar shared memory as + * tee_shm_alloc_kernel_buf(), but with the difference that the memory + * might not be registered in secure world in case the driver supports + * passing memory not registered in advance. + * + * This function should normally only be used internally in the TEE + * drivers. + * + * @returns a pointer to 'struct tee_shm' + */ +struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t siz= e) +{ + u32 flags =3D TEE_SHM_MAPPED | TEE_SHM_PRIV | TEE_SHM_POOL; + + return shm_alloc_helper(ctx, size, sizeof(long) * 2, flags, -1); +} +EXPORT_SYMBOL_GPL(tee_shm_alloc_priv_buf); + struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long ad= dr, size_t length, u32 flags) { diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index ed641dc314bd..7f038f8787c7 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -273,21 +273,7 @@ static inline void tee_shm_pool_free(struct tee_shm_po= ol *pool) */ void *tee_get_drvdata(struct tee_device *teedev); =20 -/** - * tee_shm_alloc() - Allocate shared memory - * @ctx: Context that allocates the shared memory - * @size: Requested size of shared memory - * @flags: Flags setting properties for the requested shared memory. - * - * Memory allocated as global shared memory is automatically freed when the - * TEE file pointer is closed. The @flags field uses the bits defined by - * TEE_SHM_* above. TEE_SHM_MAPPED must currently always be set. If - * TEE_SHM_DMA_BUF global shared memory will be allocated and associated - * with a dma-buf handle, else driver private memory. - * - * @returns a pointer to 'struct tee_shm' - */ -struct tee_shm *tee_shm_alloc(struct tee_context *ctx, size_t size, u32 fl= ags); +struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t siz= e); struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t s= ize); =20 /** --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 B5661C433F5 for ; Tue, 25 Jan 2022 16:34:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1380219AbiAYQd7 (ORCPT ); Tue, 25 Jan 2022 11:33:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1380367AbiAYQ3z (ORCPT ); Tue, 25 Jan 2022 11:29:55 -0500 Received: from mail-lf1-x130.google.com (mail-lf1-x130.google.com [IPv6:2a00:1450:4864:20::130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA905C061401 for ; Tue, 25 Jan 2022 08:29:53 -0800 (PST) Received: by mail-lf1-x130.google.com with SMTP id n8so17430979lfq.4 for ; Tue, 25 Jan 2022 08:29:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=pgbuyREKxRWIfTIAFEtNz/Yq0ul97hjkI0IhbisIr/U=; b=cHuTR4DKjeBcJy11i8A9aForxT/P00FHrJCpe4v7r4O+8PoSIsYcVBuLCzKdImExMz 1RKwx1NN4FVDHYy+fUEAae7a+hQbRB5kc2wwK6ROIUuM7/xKaSHtATVpjUlM6yH2bcYQ V+WVGfzwPo+zClgkvmqQ36qdaSfkbibN3pKd7PPh52+VHI5e/MRwyTtgcGSBbgWjmDf+ A1g8uVvD6G2rwtM4pdh3/PjaJL36lLjxSSuQdgxVH3MhWRg425ZOeZOj41++ZYooAm7a jzN2Sxr8H2oyOP2bWkP7GMbKOhmJT4TG3yqnisBE9Sdc7S3oBySwQI+76FntGlWsVay+ ENKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=pgbuyREKxRWIfTIAFEtNz/Yq0ul97hjkI0IhbisIr/U=; b=HkcWOj9KTOPNQD5gdS0XeZIP4+P0XuWaSHR/xZ+d+XeJAMOgjfh4fpfmd943CS7mzM e44pmhFBM+i+DhyhoWX9R5+gZWGyISGaApuv+6HCHDI2z6ju/yGIPd71/Bqo9hc7nWHF oei6G8XLo2z/VJ5mJSVgd2WhNxiN+3nYLdPnx8vTF2IaSUMIA8EwzVCPAFHRBVVPDXRS 7KtxPWmNjheFxjpSehGqcT2n6stXaRR+GwmT2A9yulI72/TfwuBHMsLMS5fb6XyH2UHB Xe2ogg+Vxo93/op16EKEp7AbqVwXA70rPPK8mA06zTvahgxVLZPXIRaiTTOjAdgBZBqi DQNA== X-Gm-Message-State: AOAM5338E8is/CPnNtjY3g5XXno0D7h6nWWgXpm5rJ9xoYZ48BCBQLHa QrA0Upp4xV4eRbBkEE56ABZOvn0MhlwIsw== X-Google-Smtp-Source: ABdhPJwviYDQH/W6jNC6XbAdwPmKiyIyjq/11j+PrxEtVEPEVjTksLgE8t2mVtbhXH7lAx+5U5nbhw== X-Received: by 2002:a05:6512:2355:: with SMTP id p21mr6242068lfu.402.1643128191848; Tue, 25 Jan 2022 08:29:51 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:51 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 06/12] optee: add driver private tee_context Date: Tue, 25 Jan 2022 17:29:32 +0100 Message-Id: <20220125162938.838382-7-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Adds a driver private tee_context by moving the tee_context in struct optee_notif to struct optee. This tee_context is used when doing internal calls to secure world to deliver notification and later also when sharing driver private memory with secure world. Signed-off-by: Jens Wiklander --- drivers/tee/optee/core.c | 1 + drivers/tee/optee/ffa_abi.c | 61 ++++++++++++++++++------------- drivers/tee/optee/optee_private.h | 5 ++- drivers/tee/optee/smc_abi.c | 40 ++++++-------------- 4 files changed, 51 insertions(+), 56 deletions(-) diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 2a369e346b85..f4bccb5f0e93 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -161,6 +161,7 @@ void optee_remove_common(struct optee *optee) optee_unregister_devices(); =20 optee_notif_uninit(optee); + teedev_close_context(optee->ctx); /* * The two devices have to be unregistered before we can free the * other resources. diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index d71880ede6d6..954e88866968 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -765,7 +765,9 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) { const struct ffa_dev_ops *ffa_ops; unsigned int rpc_arg_count; + struct tee_shm_pool *pool; struct tee_device *teedev; + struct tee_context *ctx; struct optee *optee; int rc; =20 @@ -785,12 +787,12 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) if (!optee) return -ENOMEM; =20 - optee->pool =3D optee_ffa_shm_pool_alloc_pages(); - if (IS_ERR(optee->pool)) { - rc =3D PTR_ERR(optee->pool); - optee->pool =3D NULL; - goto err; + pool =3D optee_ffa_shm_pool_alloc_pages(); + if (IS_ERR(pool)) { + rc =3D PTR_ERR(pool); + goto err_free_optee; } + optee->pool =3D pool; =20 optee->ops =3D &optee_ffa_ops; optee->ffa.ffa_dev =3D ffa_dev; @@ -801,7 +803,7 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) optee); if (IS_ERR(teedev)) { rc =3D PTR_ERR(teedev); - goto err; + goto err_free_pool; } optee->teedev =3D teedev; =20 @@ -809,50 +811,57 @@ static int optee_ffa_probe(struct ffa_device *ffa_dev) optee); if (IS_ERR(teedev)) { rc =3D PTR_ERR(teedev); - goto err; + goto err_unreg_teedev; } optee->supp_teedev =3D teedev; =20 rc =3D tee_device_register(optee->teedev); if (rc) - goto err; + goto err_unreg_supp_teedev; =20 rc =3D tee_device_register(optee->supp_teedev); if (rc) - goto err; + goto err_unreg_supp_teedev; =20 rc =3D rhashtable_init(&optee->ffa.global_ids, &shm_rhash_params); if (rc) - goto err; + goto err_unreg_supp_teedev; mutex_init(&optee->ffa.mutex); mutex_init(&optee->call_queue.mutex); INIT_LIST_HEAD(&optee->call_queue.waiters); optee_supp_init(&optee->supp); ffa_dev_set_drvdata(ffa_dev, optee); + ctx =3D teedev_open(optee->teedev); + if (IS_ERR(ctx)) + goto err_rhashtable_free; + optee->ctx =3D ctx; rc =3D optee_notif_init(optee, OPTEE_DEFAULT_MAX_NOTIF_VALUE); - if (rc) { - optee_ffa_remove(ffa_dev); - return rc; - } + if (rc) + goto err_close_ctx; =20 rc =3D optee_enumerate_devices(PTA_CMD_GET_DEVICES); - if (rc) { - optee_ffa_remove(ffa_dev); - return rc; - } + if (rc) + goto err_unregister_devices; =20 pr_info("initialized driver\n"); return 0; -err: - /* - * tee_device_unregister() is safe to call even if the - * devices hasn't been registered with - * tee_device_register() yet. - */ + +err_unregister_devices: + optee_unregister_devices(); + optee_notif_uninit(optee); +err_close_ctx: + teedev_close_context(ctx); +err_rhashtable_free: + rhashtable_free_and_destroy(&optee->ffa.global_ids, rh_free_fn, NULL); + optee_supp_uninit(&optee->supp); + mutex_destroy(&optee->call_queue.mutex); +err_unreg_supp_teedev: tee_device_unregister(optee->supp_teedev); +err_unreg_teedev: tee_device_unregister(optee->teedev); - if (optee->pool) - tee_shm_pool_free(optee->pool); +err_free_pool: + tee_shm_pool_free(pool); +err_free_optee: kfree(optee); return rc; } diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_pr= ivate.h index df2450921464..df3a483bbf46 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -53,7 +53,6 @@ struct optee_call_queue { =20 struct optee_notif { u_int max_key; - struct tee_context *ctx; /* Serializes access to the elements below in this struct */ spinlock_t lock; struct list_head db; @@ -134,9 +133,10 @@ struct optee_ops { /** * struct optee - main service struct * @supp_teedev: supplicant device + * @teedev: client device * @ops: internal callbacks for different ways to reach secure * world - * @teedev: client device + * @ctx: driver internal TEE context * @smc: specific to SMC ABI * @ffa: specific to FF-A ABI * @call_queue: queue of threads waiting to call @invoke_fn @@ -152,6 +152,7 @@ struct optee { struct tee_device *supp_teedev; struct tee_device *teedev; const struct optee_ops *ops; + struct tee_context *ctx; union { struct optee_smc smc; struct optee_ffa ffa; diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index 66d5d1b56b95..b1082a34cda2 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -952,57 +952,34 @@ static irqreturn_t notif_irq_thread_fn(int irq, void = *dev_id) { struct optee *optee =3D dev_id; =20 - optee_smc_do_bottom_half(optee->notif.ctx); + optee_smc_do_bottom_half(optee->ctx); =20 return IRQ_HANDLED; } =20 static int optee_smc_notif_init_irq(struct optee *optee, u_int irq) { - struct tee_context *ctx; int rc; =20 - ctx =3D teedev_open(optee->teedev); - if (IS_ERR(ctx)) - return PTR_ERR(ctx); - - optee->notif.ctx =3D ctx; rc =3D request_threaded_irq(irq, notif_irq_handler, notif_irq_thread_fn, 0, "optee_notification", optee); if (rc) - goto err_close_ctx; + return rc; =20 optee->smc.notif_irq =3D irq; =20 return 0; - -err_close_ctx: - teedev_close_context(optee->notif.ctx); - optee->notif.ctx =3D NULL; - - return rc; } =20 static void optee_smc_notif_uninit_irq(struct optee *optee) { - if (optee->notif.ctx) { - optee_smc_stop_async_notif(optee->notif.ctx); + if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_ASYNC_NOTIF) { + optee_smc_stop_async_notif(optee->ctx); if (optee->smc.notif_irq) { free_irq(optee->smc.notif_irq, optee); irq_dispose_mapping(optee->smc.notif_irq); } - - /* - * The thread normally working with optee->notif.ctx was - * stopped with free_irq() above. - * - * Note we're not using teedev_close_context() or - * tee_client_close_context() since we have already called - * tee_device_put() while initializing to avoid a circular - * reference counting. - */ - teedev_close_context(optee->notif.ctx); } } =20 @@ -1307,6 +1284,7 @@ static int optee_probe(struct platform_device *pdev) struct optee *optee =3D NULL; void *memremaped_shm =3D NULL; struct tee_device *teedev; + struct tee_context *ctx; u32 max_notif_value; u32 sec_caps; int rc; @@ -1387,9 +1365,13 @@ static int optee_probe(struct platform_device *pdev) optee->pool =3D pool; =20 platform_set_drvdata(pdev, optee); + ctx =3D teedev_open(optee->teedev); + if (IS_ERR(ctx)) + goto err_supp_uninit; + optee->ctx =3D ctx; rc =3D optee_notif_init(optee, max_notif_value); if (rc) - goto err_supp_uninit; + goto err_close_ctx; =20 if (sec_caps & OPTEE_SMC_SEC_CAP_ASYNC_NOTIF) { unsigned int irq; @@ -1437,6 +1419,8 @@ static int optee_probe(struct platform_device *pdev) optee_unregister_devices(); err_notif_uninit: optee_notif_uninit(optee); +err_close_ctx: + teedev_close_context(ctx); err_supp_uninit: optee_supp_uninit(&optee->supp); mutex_destroy(&optee->call_queue.mutex); --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 842DAC433FE for ; Tue, 25 Jan 2022 16:35:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1583905AbiAYQe7 (ORCPT ); Tue, 25 Jan 2022 11:34:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37386 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1380581AbiAYQ3z (ORCPT ); Tue, 25 Jan 2022 11:29:55 -0500 Received: from mail-lf1-x12f.google.com (mail-lf1-x12f.google.com [IPv6:2a00:1450:4864:20::12f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D9B43C061747 for ; Tue, 25 Jan 2022 08:29:54 -0800 (PST) Received: by mail-lf1-x12f.google.com with SMTP id x23so10844180lfc.0 for ; Tue, 25 Jan 2022 08:29:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sngM1MTBG7FbSgx6kzN4DBsXrM+u+p1VNu+9KTohzwQ=; b=vXR6w3Ct9pbhQBGqGIWoXvBNUWYe2WkFktusJV1qAdeMikoPAbHFB47bJ6QqSjeNuL lr1LKkfbp0mVu+HlAQd6wowoxaFLoHOp6L5EnS7UyNNZFqN+cmRjSTA49LWQWA5rh+zC GZHB2LJLNOj+MTVc/IiaTvvsDmQlE2EOKyF+N6YvS0ZdNzPYVW9HuYcFLkVwdmGgemwG Je2cNjWc1bB7BqeLPNg5HRT3lYe6fpkdmNY7mi3VDvfhvkfGDB774fiBFMlKyXe5hh0Y FBP0hfznOJGirRdT1Pozi0OZBMhtK5xuiPQkSph3pik8RmuCvThdniVaTvouZT6f+p6j UgSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sngM1MTBG7FbSgx6kzN4DBsXrM+u+p1VNu+9KTohzwQ=; b=LbEw28XKqr+jKsezTEsFTQeMPjMnRvQyqOO/ifGNDrY9AbBhXmI7VfVTJPqHoqXPe6 HWoQ0wEe8JX/71HBOAoBBllGOLU0P37uzLR7BFP225sV0McA486AtFQ7dZwIUrQUMJyS jcr3URgaknxHIQ66PFr5PqWyrbP3Up4I2o632KKsi8jkox/HocXKGl26PTVxKZqC6twq oJaG8k+MWZXpeYnmVN1X5G1JsE007cvmtIKRXSOiJWnALUYxaD5epNwzbk221iQ5vz3T 8e53/6rHsOpTTTQWEuBjBIxn/7d992qp0+yWRzbwV8fRnfFArFflXIAPMMZa7o7Ws5J5 GMlQ== X-Gm-Message-State: AOAM533mf21XYF1kJ8O51BdsA/Bkv4pHPN3rJ6HfHt+NzXEiYPWWfBRZ d93DwzXZtjWIJEQcvcVNw9Z64AzO+CyWrQ== X-Google-Smtp-Source: ABdhPJwGxDw457LD2Vw2V0f5S3EHpS3N44t4L6sI0rbhLQv23J+AO+xeJARfEWNjtfaw4Zix46+DFw== X-Received: by 2002:a05:6512:118c:: with SMTP id g12mr17393250lfr.55.1643128192950; Tue, 25 Jan 2022 08:29:52 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:52 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander , stable@vger.kernel.org Subject: [PATCH v3 07/12] optee: use driver internal tee_contex for some rpc Date: Tue, 25 Jan 2022 17:29:33 +0100 Message-Id: <20220125162938.838382-8-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Uses the new driver internal tee_context when allocating driver private shared memory. This decouples the shared memory object from its original tee_context. This is needed when the life time of such a memory allocation outlives the client tee_context. Fixes: 217e0250cccb ("tee: use reference counting for tee_context") Cc: stable@vger.kernel.org Reviewed-by: Sumit Garg Signed-off-by: Jens Wiklander --- drivers/tee/optee/ffa_abi.c | 17 +++++++++-------- drivers/tee/optee/smc_abi.c | 7 ++++--- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index 954e88866968..fb7345941024 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -424,6 +424,7 @@ static struct tee_shm_pool *optee_ffa_shm_pool_alloc_pa= ges(void) */ =20 static void handle_ffa_rpc_func_cmd_shm_alloc(struct tee_context *ctx, + struct optee *optee, struct optee_msg_arg *arg) { struct tee_shm *shm; @@ -439,7 +440,8 @@ static void handle_ffa_rpc_func_cmd_shm_alloc(struct te= e_context *ctx, shm =3D optee_rpc_cmd_alloc_suppl(ctx, arg->params[0].u.value.b); break; case OPTEE_RPC_SHM_TYPE_KERNEL: - shm =3D tee_shm_alloc_priv_buf(ctx, arg->params[0].u.value.b); + shm =3D tee_shm_alloc_priv_buf(optee->ctx, + arg->params[0].u.value.b); break; default: arg->ret =3D TEEC_ERROR_BAD_PARAMETERS; @@ -492,14 +494,13 @@ static void handle_ffa_rpc_func_cmd_shm_free(struct t= ee_context *ctx, } =20 static void handle_ffa_rpc_func_cmd(struct tee_context *ctx, + struct optee *optee, struct optee_msg_arg *arg) { - struct optee *optee =3D tee_get_drvdata(ctx->teedev); - arg->ret_origin =3D TEEC_ORIGIN_COMMS; switch (arg->cmd) { case OPTEE_RPC_CMD_SHM_ALLOC: - handle_ffa_rpc_func_cmd_shm_alloc(ctx, arg); + handle_ffa_rpc_func_cmd_shm_alloc(ctx, optee, arg); break; case OPTEE_RPC_CMD_SHM_FREE: handle_ffa_rpc_func_cmd_shm_free(ctx, optee, arg); @@ -509,12 +510,12 @@ static void handle_ffa_rpc_func_cmd(struct tee_contex= t *ctx, } } =20 -static void optee_handle_ffa_rpc(struct tee_context *ctx, u32 cmd, - struct optee_msg_arg *arg) +static void optee_handle_ffa_rpc(struct tee_context *ctx, struct optee *op= tee, + u32 cmd, struct optee_msg_arg *arg) { switch (cmd) { case OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD: - handle_ffa_rpc_func_cmd(ctx, arg); + handle_ffa_rpc_func_cmd(ctx, optee, arg); break; case OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT: /* Interrupt delivered by now */ @@ -581,7 +582,7 @@ static int optee_ffa_yielding_call(struct tee_context *= ctx, * above. */ cond_resched(); - optee_handle_ffa_rpc(ctx, data->data1, rpc_arg); + optee_handle_ffa_rpc(ctx, optee, data->data1, rpc_arg); cmd =3D OPTEE_FFA_YIELDING_CALL_RESUME; data->data0 =3D cmd; data->data1 =3D 0; diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index b1082a34cda2..0dc383c974a3 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -621,6 +621,7 @@ static void handle_rpc_func_cmd_shm_free(struct tee_con= text *ctx, } =20 static void handle_rpc_func_cmd_shm_alloc(struct tee_context *ctx, + struct optee *optee, struct optee_msg_arg *arg, struct optee_call_ctx *call_ctx) { @@ -650,7 +651,7 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_co= ntext *ctx, shm =3D optee_rpc_cmd_alloc_suppl(ctx, sz); break; case OPTEE_RPC_SHM_TYPE_KERNEL: - shm =3D tee_shm_alloc_priv_buf(ctx, sz); + shm =3D tee_shm_alloc_priv_buf(optee->ctx, sz); break; default: arg->ret =3D TEEC_ERROR_BAD_PARAMETERS; @@ -746,7 +747,7 @@ static void handle_rpc_func_cmd(struct tee_context *ctx= , struct optee *optee, switch (arg->cmd) { case OPTEE_RPC_CMD_SHM_ALLOC: free_pages_list(call_ctx); - handle_rpc_func_cmd_shm_alloc(ctx, arg, call_ctx); + handle_rpc_func_cmd_shm_alloc(ctx, optee, arg, call_ctx); break; case OPTEE_RPC_CMD_SHM_FREE: handle_rpc_func_cmd_shm_free(ctx, arg); @@ -775,7 +776,7 @@ static void optee_handle_rpc(struct tee_context *ctx, =20 switch (OPTEE_SMC_RETURN_GET_RPC_FUNC(param->a0)) { case OPTEE_SMC_RPC_FUNC_ALLOC: - shm =3D tee_shm_alloc_priv_buf(ctx, param->a1); + shm =3D tee_shm_alloc_priv_buf(optee->ctx, param->a1); if (!IS_ERR(shm) && !tee_shm_get_pa(shm, 0, &pa)) { reg_pair_from_64(¶m->a1, ¶m->a2, pa); reg_pair_from_64(¶m->a4, ¶m->a5, --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 B957BC433EF for ; Tue, 25 Jan 2022 16:34:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1451387AbiAYQeq (ORCPT ); Tue, 25 Jan 2022 11:34:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37388 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1380642AbiAYQ34 (ORCPT ); Tue, 25 Jan 2022 11:29:56 -0500 Received: from mail-lf1-x132.google.com (mail-lf1-x132.google.com [IPv6:2a00:1450:4864:20::132]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9A57C06173B for ; Tue, 25 Jan 2022 08:29:55 -0800 (PST) Received: by mail-lf1-x132.google.com with SMTP id x23so10844288lfc.0 for ; Tue, 25 Jan 2022 08:29:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wM1CGdwosWr/o/zdNTKI7CddYVnDP6JJ4xL8rpa+Aas=; b=czVsqeDAcTn5kRJ27t75r4cQgrJ0ojxkSDuTanEeKiRZ1UYWagh7myXcwNZtEEplV1 rTXiNc5wgrEdembulrWLk9Wdyfts3k8asT3bzaG0yRvOUBtl5tx1wwLyKo8cgRk2o6rS rbw15vDLHlO/ZD9rBE8B7AhLGKEaBuyuPSMBJq+76yTnEeXbpo+e9d3Qam6UhfathHzO BPmO5Q1BiPC37Y8kSnuTkvYuDurAcRYPCYr77bm4FjUdh6rlrXOx+ix4QD6YWuRncbHx esbChIXhWpkDPjMZRZtuHSgHYDb8cHwZ3+VMvV+LS9VG/8lOzCqFZsouCS3DhpZ7NIow Spzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wM1CGdwosWr/o/zdNTKI7CddYVnDP6JJ4xL8rpa+Aas=; b=hebWEzZQJn8RuZWINx0POBd4842qENw2lGd/20zEkafQ8nY4kL9lxM6SZQoHUihBl5 c0D1yRXrcKTxdWA2QYhKDJiowYypbAtSEny6rzwu6wL8u9PJW8WlYQtkBEC+0Y19drx7 9bqY9VWkbv7ykFl0l+ILEhZHvmqNVFPUPj1nIIVo9orbslEcXeB3I9bB5LuXJU7t6pJf ZBtFAFtUQi7B2EW/9i7MmE0LltfGLgRbGNrOBvFu2MM2+74M6OOOBVgamc5G8cpNbuoE aUSphiDtxs08emojwvvrpxPuEyQtSlO74s9hjxDqg+/LQMjfk1/uMm1TRrvP1QlmbmPb aWeQ== X-Gm-Message-State: AOAM530visMherKtdQo9MGhnWGfb8aMdSLo4rxBCjnQAOz/AGKCLImTW A6sl17luA2XoeWvJF2ClDroksi9gi1S1nQ== X-Google-Smtp-Source: ABdhPJwQC8ZpuWD/gnJYu1zep0OIKJMceUdl1vKx0nHl35vObk1PDkyOhBH2dXNB94I2vxEAeZSFCw== X-Received: by 2002:a05:6512:11d0:: with SMTP id h16mr16878548lfr.307.1643128194030; Tue, 25 Jan 2022 08:29:54 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:53 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 08/12] optee: add optee_pool_op_free_helper() Date: Tue, 25 Jan 2022 17:29:34 +0100 Message-Id: <20220125162938.838382-9-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Adds a common helper function to free a tee_shm allocated using the helper function optee_pool_op_alloc_helper(). Reviewed-by: Sumit Garg Signed-off-by: Jens Wiklander --- drivers/tee/optee/core.c | 10 ++++++++++ drivers/tee/optee/ffa_abi.c | 4 +--- drivers/tee/optee/optee_private.h | 3 +++ drivers/tee/optee/smc_abi.c | 7 +++---- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index f4bccb5f0e93..daf947e98d14 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -69,6 +69,16 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool *pool= , struct tee_shm *shm, return rc; } =20 +void optee_pool_op_free_helper(struct tee_shm_pool *pool, struct tee_shm *= shm, + int (*shm_unregister)(struct tee_context *ctx, + struct tee_shm *shm)) +{ + if (shm_unregister) + shm_unregister(shm->ctx, shm); + free_pages((unsigned long)shm->kaddr, get_order(shm->size)); + shm->kaddr =3D NULL; +} + static void optee_bus_scan(struct work_struct *work) { WARN_ON(optee_enumerate_devices(PTA_CMD_GET_DEVICES_SUPP)); diff --git a/drivers/tee/optee/ffa_abi.c b/drivers/tee/optee/ffa_abi.c index fb7345941024..8cd9c70a9268 100644 --- a/drivers/tee/optee/ffa_abi.c +++ b/drivers/tee/optee/ffa_abi.c @@ -379,9 +379,7 @@ static int pool_ffa_op_alloc(struct tee_shm_pool *pool, static void pool_ffa_op_free(struct tee_shm_pool *pool, struct tee_shm *shm) { - optee_ffa_shm_unregister(shm->ctx, shm); - free_pages((unsigned long)shm->kaddr, get_order(shm->size)); - shm->kaddr =3D NULL; + optee_pool_op_free_helper(pool, shm, optee_ffa_shm_unregister); } =20 static void pool_ffa_op_destroy_pool(struct tee_shm_pool *pool) diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_pr= ivate.h index df3a483bbf46..e77765c78878 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -236,6 +236,9 @@ int optee_pool_op_alloc_helper(struct tee_shm_pool *poo= l, struct tee_shm *shm, struct page **pages, size_t num_pages, unsigned long start)); +void optee_pool_op_free_helper(struct tee_shm_pool *pool, struct tee_shm *= shm, + int (*shm_unregister)(struct tee_context *ctx, + struct tee_shm *shm)); =20 =20 void optee_remove_common(struct optee *optee); diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index 0dc383c974a3..9c1c9cfb7488 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -548,10 +548,9 @@ static void pool_op_free(struct tee_shm_pool *pool, struct tee_shm *shm) { if (!(shm->flags & TEE_SHM_PRIV)) - optee_shm_unregister(shm->ctx, shm); - - free_pages((unsigned long)shm->kaddr, get_order(shm->size)); - shm->kaddr =3D NULL; + optee_pool_op_free_helper(pool, shm, optee_shm_unregister); + else + optee_pool_op_free_helper(pool, shm, NULL); } =20 static void pool_op_destroy_pool(struct tee_shm_pool *pool) --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 2595BC433EF for ; Tue, 25 Jan 2022 16:34:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1583847AbiAYQeh (ORCPT ); Tue, 25 Jan 2022 11:34:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381252AbiAYQ36 (ORCPT ); Tue, 25 Jan 2022 11:29:58 -0500 Received: from mail-lf1-x129.google.com (mail-lf1-x129.google.com [IPv6:2a00:1450:4864:20::129]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2393BC06173D for ; Tue, 25 Jan 2022 08:29:57 -0800 (PST) Received: by mail-lf1-x129.google.com with SMTP id a28so27704022lfl.7 for ; Tue, 25 Jan 2022 08:29:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DUf2IpmTkIYobRbe8lkHT4fFtqU+2fZBqENflNdIXV0=; b=q3dCQjJA3SRbqyvHCl0hOJ8dIF5iZ7sfdpA2NboC+O34lRz+eweMQBBgv/aTZDrkWW IKbDKwx6LuE8lf3qjXa059gegqgavzhtRy67CeNOxJq63IRKuBqMVZskDNgUJVgxlteE CKLkH6Uoyt4LinAYcmDIJVgbsWZ7iLoQfH3ws00vYnatoqPvV5kPp5x4dDTw0xJR/FHV HHzvKvUE6+Onmyhm68dCCSFox75w9tEy/UqkNSSvrQnKCRFiwa6lhyN+f0DIzQ2Wau89 cXPZ/cPwTa2eHOrLzt+9XUr4nRXLZQFb1xXX04i9wWz4z4Xm1VZV+Aqi2hjMmExtdgT0 /gwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DUf2IpmTkIYobRbe8lkHT4fFtqU+2fZBqENflNdIXV0=; b=IvVp7rRgivrTRP8bd5x0QKZfKpcK9bbse7K/roVbwbzfAyht/5SrQem8NRn9koIfhl 6b2TpWVk9mgXpKOtG0KDMP/htmARHPQ5mBGtvrsvY+/C0CDaGrpu0g4z61voUJwGSHwx kMsdVgIjjcxhlBjPG9DFID1Ps8+Fzfnh5Ypmiu+s3+hfjDzfXmPCQXgwxMxmkyAFGl0d GV0tExk575ygtrBYdUd6Bn51kfMRfLPL4sMUxxreH0KXtCSfvL+uJ1YXcT12dqGrCrIA sfFKemTeA72X95sNHY5oT5ckZ8dTI6aOnxVU+TqF1uTE4hpOK0PaC62UrQ6sj8EEX9s5 j22g== X-Gm-Message-State: AOAM5317lc+BqkLaIA+GqEPuZKBSDOXDVXLjIDjnyYo7UchBj6K9oVZG 1flWhulYs+xZgPyXOVWFqvVoGiEjDy+A4g== X-Google-Smtp-Source: ABdhPJz35bNItxbTfmE9wTvr/YBESFvDxWlOmcSF4xWJqkDfHvuVt8RUehvchZsp0XK67PKKZLGsBA== X-Received: by 2002:a05:6512:3d21:: with SMTP id d33mr4917580lfv.125.1643128195232; Tue, 25 Jan 2022 08:29:55 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:54 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 09/12] tee: add tee_shm_register_{user,kernel}_buf() Date: Tue, 25 Jan 2022 17:29:35 +0100 Message-Id: <20220125162938.838382-10-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Adds the two new functions tee_shm_register_user_buf() and tee_shm_register_kernel_buf() which should be used instead of the old tee_shm_register(). This avoids having the caller supplying the flags parameter which exposes a bit more than desired of the internals of the TEE subsystem. Signed-off-by: Jens Wiklander --- drivers/tee/tee_core.c | 3 +-- drivers/tee/tee_private.h | 2 ++ drivers/tee/tee_shm.c | 33 +++++++++++++++++++++++++++++++++ include/linux/tee_drv.h | 2 ++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/drivers/tee/tee_core.c b/drivers/tee/tee_core.c index a15812baaeb1..8aa1a4836b92 100644 --- a/drivers/tee/tee_core.c +++ b/drivers/tee/tee_core.c @@ -334,8 +334,7 @@ tee_ioctl_shm_register(struct tee_context *ctx, if (data.flags) return -EINVAL; =20 - shm =3D tee_shm_register(ctx, data.addr, data.length, - TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED); + shm =3D tee_shm_register_user_buf(ctx, data.addr, data.length); if (IS_ERR(shm)) return PTR_ERR(shm); =20 diff --git a/drivers/tee/tee_private.h b/drivers/tee/tee_private.h index 7265f47c6d8e..409cadcc1cff 100644 --- a/drivers/tee/tee_private.h +++ b/drivers/tee/tee_private.h @@ -58,5 +58,7 @@ void teedev_ctx_get(struct tee_context *ctx); void teedev_ctx_put(struct tee_context *ctx); =20 struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t siz= e); +struct tee_shm *tee_shm_register_user_buf(struct tee_context *ctx, + unsigned long addr, size_t length); =20 #endif /*TEE_PRIVATE_H*/ diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index dc02afd7b5c9..0b6f7aabbf88 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -299,6 +299,39 @@ struct tee_shm *tee_shm_register(struct tee_context *c= tx, unsigned long addr, } EXPORT_SYMBOL_GPL(tee_shm_register); =20 +/** + * tee_shm_register_user_buf() - Register a userspace shared memory buffer + * @ctx: Context that registers the shared memory + * @addr: The userspace address of the shared buffer + * @length: Length of the shared buffer + * + * @returns a pointer to 'struct tee_shm' + */ +struct tee_shm *tee_shm_register_user_buf(struct tee_context *ctx, + unsigned long addr, size_t length) +{ + return tee_shm_register(ctx, addr, length, + TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED); +} + +/** + * tee_shm_register_kernel_buf() - Register kernel memory to be shared with + * secure world + * @ctx: Context that registers the shared memory + * @addr: The buffer + * @length: Length of the buffer + * + * @returns a pointer to 'struct tee_shm' + */ + +struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx, + void *addr, size_t length) +{ + return tee_shm_register(ctx, (unsigned long)addr, length, + TEE_SHM_DMA_BUF | TEE_SHM_KERNEL_MAPPED); +} +EXPORT_SYMBOL_GPL(tee_shm_register_kernel_buf); + static int tee_shm_fop_release(struct inode *inode, struct file *filp) { tee_shm_put(filp->private_data); diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index 7f038f8787c7..c9d2cc32a5ed 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -287,6 +287,8 @@ struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_con= text *ctx, size_t size); */ struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long ad= dr, size_t length, u32 flags); +struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx, + void *addr, size_t length); =20 /** * tee_shm_is_registered() - Check if shared memory object in registered i= n TEE --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 2871FC433F5 for ; Tue, 25 Jan 2022 16:36:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346006AbiAYQgR (ORCPT ); Tue, 25 Jan 2022 11:36:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1383773AbiAYQ36 (ORCPT ); Tue, 25 Jan 2022 11:29:58 -0500 Received: from mail-lj1-x230.google.com (mail-lj1-x230.google.com [IPv6:2a00:1450:4864:20::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 316C6C06173E for ; Tue, 25 Jan 2022 08:29:58 -0800 (PST) Received: by mail-lj1-x230.google.com with SMTP id e17so4452032ljk.5 for ; Tue, 25 Jan 2022 08:29:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IS0JYukQ1AvM/V854xXkjA8DA3zzQrPupG56zCEbY2A=; b=UWaP0AO1n2pGaP2HeNNtZwiIpiNSxrKn9hvufz8KXH8tidHqfE7craAOpuWNAh3aUI 8nA7oMVKIUrstRQ/+mixAodiJCxocrBBebTEO6kYMSuvn2VxlwhUVYH+3uqsuwp/Qj5k 65rDQixL////VfikBNNtr2AMWJGvhal1BsdYL2CUNFYUXE+tp8s0sTeEKUaZZPtxK60k DfhyzcZrBXnpQv/VdiPkHur7UqOcB5I3j2DMrhpmbkjy6Kvp7nd0LrgYgs1lLi6gmeKS hkNPOgtjdcxgaVBhibOaG0JlOW5x5Wj2U2hNMqNQcX/LpYSnW2JK8TYUCRafeV3HffTQ +YDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IS0JYukQ1AvM/V854xXkjA8DA3zzQrPupG56zCEbY2A=; b=rfWD0NwGJRklQCM9y+iMGTXKz9PNDX+4/iycUTe6FpbyDGia4C45BJQgG3BmmmGpfa gxkl8BYHbFgtmFFRo7nbmhn1VP+aSLqDFpuWCCpxkCphBFu0RlNBzEtMYrD9Ybj9LRLU L0utvud/3aomVd6GGPTJMq+W6d/8v2tHYVinio0D/45hUUs0M6zuESwvXljny+IYMXoK l54mF80208FmeQQJ0CqCQQhM/bCarMQAHOxZh1VV/fKGWMyveSHxx56gdX1zxF8eCipx JtOfGxD3URMEpaA0SrrnIw+hpcc7+ZzIC/3We3+SalwE1cKbimT64p4tU4j9v3Gv6vYr /ypg== X-Gm-Message-State: AOAM532ruIKWBT+d2J6g4W7H4SAahEzhpjTb+rPinICj6USm+KZCvtZn jJIyV9Tp2LxW1oNfWNMSKddIijDkN4ly2w== X-Google-Smtp-Source: ABdhPJyt2baCBXDu7rjIjXTmZHaKBDthZf1ExPVNShOaWzTP/1WYkOhm6KV7XxshoN5yFZymIIiedw== X-Received: by 2002:a2e:a279:: with SMTP id k25mr14523841ljm.163.1643128196299; Tue, 25 Jan 2022 08:29:56 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:55 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 10/12] KEYS: trusted: tee: use tee_shm_register_kernel_buf() Date: Tue, 25 Jan 2022 17:29:36 +0100 Message-Id: <20220125162938.838382-11-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Uses the new simplified tee_shm_register_kernel_buf() function instead of the old tee_shm_alloc() function which required specific TEE_SHM-flags Reviewed-by: Sumit Garg Signed-off-by: Jens Wiklander --- security/keys/trusted-keys/trusted_tee.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/security/keys/trusted-keys/trusted_tee.c b/security/keys/trust= ed-keys/trusted_tee.c index 2ce66c199e1d..c8626686ee1b 100644 --- a/security/keys/trusted-keys/trusted_tee.c +++ b/security/keys/trusted-keys/trusted_tee.c @@ -70,17 +70,15 @@ static int trusted_tee_seal(struct trusted_key_payload = *p, char *datablob) memset(&inv_arg, 0, sizeof(inv_arg)); memset(¶m, 0, sizeof(param)); =20 - reg_shm_in =3D tee_shm_register(pvt_data.ctx, (unsigned long)p->key, - p->key_len, TEE_SHM_DMA_BUF | - TEE_SHM_KERNEL_MAPPED); + reg_shm_in =3D tee_shm_register_kernel_buf(pvt_data.ctx, p->key, + p->key_len); if (IS_ERR(reg_shm_in)) { dev_err(pvt_data.dev, "key shm register failed\n"); return PTR_ERR(reg_shm_in); } =20 - reg_shm_out =3D tee_shm_register(pvt_data.ctx, (unsigned long)p->blob, - sizeof(p->blob), TEE_SHM_DMA_BUF | - TEE_SHM_KERNEL_MAPPED); + reg_shm_out =3D tee_shm_register_kernel_buf(pvt_data.ctx, p->blob, + sizeof(p->blob)); if (IS_ERR(reg_shm_out)) { dev_err(pvt_data.dev, "blob shm register failed\n"); ret =3D PTR_ERR(reg_shm_out); @@ -131,17 +129,15 @@ static int trusted_tee_unseal(struct trusted_key_payl= oad *p, char *datablob) memset(&inv_arg, 0, sizeof(inv_arg)); memset(¶m, 0, sizeof(param)); =20 - reg_shm_in =3D tee_shm_register(pvt_data.ctx, (unsigned long)p->blob, - p->blob_len, TEE_SHM_DMA_BUF | - TEE_SHM_KERNEL_MAPPED); + reg_shm_in =3D tee_shm_register_kernel_buf(pvt_data.ctx, p->blob, + p->blob_len); if (IS_ERR(reg_shm_in)) { dev_err(pvt_data.dev, "blob shm register failed\n"); return PTR_ERR(reg_shm_in); } =20 - reg_shm_out =3D tee_shm_register(pvt_data.ctx, (unsigned long)p->key, - sizeof(p->key), TEE_SHM_DMA_BUF | - TEE_SHM_KERNEL_MAPPED); + reg_shm_out =3D tee_shm_register_kernel_buf(pvt_data.ctx, p->key, + sizeof(p->key)); if (IS_ERR(reg_shm_out)) { dev_err(pvt_data.dev, "key shm register failed\n"); ret =3D PTR_ERR(reg_shm_out); @@ -192,8 +188,7 @@ static int trusted_tee_get_random(unsigned char *key, s= ize_t key_len) memset(&inv_arg, 0, sizeof(inv_arg)); memset(¶m, 0, sizeof(param)); =20 - reg_shm =3D tee_shm_register(pvt_data.ctx, (unsigned long)key, key_len, - TEE_SHM_DMA_BUF | TEE_SHM_KERNEL_MAPPED); + reg_shm =3D tee_shm_register_kernel_buf(pvt_data.ctx, key, key_len); if (IS_ERR(reg_shm)) { dev_err(pvt_data.dev, "key shm register failed\n"); return PTR_ERR(reg_shm); --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 E2F89C433EF for ; Tue, 25 Jan 2022 16:35:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1583961AbiAYQfL (ORCPT ); Tue, 25 Jan 2022 11:35:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37386 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1384569AbiAYQ37 (ORCPT ); Tue, 25 Jan 2022 11:29:59 -0500 Received: from mail-lf1-x12f.google.com (mail-lf1-x12f.google.com [IPv6:2a00:1450:4864:20::12f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5A06CC06173B for ; Tue, 25 Jan 2022 08:29:59 -0800 (PST) Received: by mail-lf1-x12f.google.com with SMTP id o12so14391146lfg.12 for ; Tue, 25 Jan 2022 08:29:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=r+/DJdCtq5HkZ1TSBJ7/l42hzle6ImDYuz3Z1vtHeBo=; b=K34Ctnvzpq6EEO5cL0iCMiBIscPMBi2F8QSycPvefvciNQq8UMh7MOgpg4hYGP3ik+ PGOCXMUY3PxnwfwVO9cSgejMTHC1wTmZsDJyM9d9dUX908fAAvHv046topN8RDWw8Evo Rd9385pUnLIzrMHdwBTQLJyLelrnorR4L/a4IL3k1w4V5Rwv6/DKSoEBGWEZA0G0ewDD 4p6LTNJwOfjbKRc85fBjtk9IwKPObDNStfuZO5nrlu4kDWt7miqv9raNMJ/2NBlJ0zu3 ai4zSWdAiDwauVei46EN6Om/Yiqfhm18D/wDgJOaw8RE6A5pF5njOjzR4hGSe5DXa3F4 yMCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=r+/DJdCtq5HkZ1TSBJ7/l42hzle6ImDYuz3Z1vtHeBo=; b=fj9+k/uu5Q+WtLZC6EnEYKUCfu4vvPfRBGbqAAkOYaXUB50LKQyVnYLAVb1Bq7q0sW XvG0tX00RRvjxUHXa2jQHWhpp/dznJ7FiK4SqIGgeSwFd/KMD0YfOhUkkkTtJeHUDNjI /6AmdLcdhEwoy7cEG/x9FDax3OtzWYRXDmxuqrnHX/puko7S3uDSSREoV/nAJzcvrdLX LWEOmDwocDYh20C5p/KVVJZgjZChjHUNPuq77zgEgKuxEEbWtzu6SY1VNCFvgIbMSutH aTpdxddGwEhnvFmc/Zd+AmtONJuAlDuJ2hWPJvybtVJbw991bl62iVju+gzcZu0keab5 mKFw== X-Gm-Message-State: AOAM5328ldeOrpjboiC4Jg/HwHLsl+UyMoKQAFhRxX+4I8OvxRwWASwW fqXN41QH+L8sWM591v7nb1i2Akyqf9R3qw== X-Google-Smtp-Source: ABdhPJyWvoZJkKZv2HkhUkqz9ADES6xlMLR5mNV/TcbvCsnUuCQqejopnEuecGcopr2kkDNqCXEYbw== X-Received: by 2002:a05:6512:398c:: with SMTP id j12mr13460111lfu.578.1643128197408; Tue, 25 Jan 2022 08:29:57 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:56 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 11/12] tee: replace tee_shm_register() Date: Tue, 25 Jan 2022 17:29:37 +0100 Message-Id: <20220125162938.838382-12-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" tee_shm_register() is replaced by the previously introduced functions tee_shm_register_user_buf() and tee_shm_register_kernel_buf(). Since there are not external callers left we can remove tee_shm_register() and refactor the remains. Signed-off-by: Jens Wiklander --- drivers/tee/tee_shm.c | 156 +++++++++++++++++++++++----------------- include/linux/tee_drv.h | 11 --- 2 files changed, 90 insertions(+), 77 deletions(-) diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index 0b6f7aabbf88..c3a29022ec72 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -12,17 +12,43 @@ #include #include "tee_private.h" =20 +static void shm_put_kernel_pages(struct page **pages, size_t page_count) +{ + size_t n; + + for (n =3D 0; n < page_count; n++) + put_page(pages[n]); +} + +static int shm_get_kernel_pages(unsigned long start, size_t page_count, + struct page **pages) +{ + struct kvec *kiov; + size_t n; + int rc; + + 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); + + return rc; +} + static void release_registered_pages(struct tee_shm *shm) { if (shm->pages) { - if (shm->flags & TEE_SHM_USER_MAPPED) { + if (shm->flags & TEE_SHM_USER_MAPPED) unpin_user_pages(shm->pages, shm->num_pages); - } else { - size_t n; - - for (n =3D 0; n < shm->num_pages; n++) - put_page(shm->pages[n]); - } + else + shm_put_kernel_pages(shm->pages, shm->num_pages); =20 kfree(shm->pages); } @@ -189,28 +215,24 @@ struct tee_shm *tee_shm_alloc_priv_buf(struct tee_con= text *ctx, size_t size) } EXPORT_SYMBOL_GPL(tee_shm_alloc_priv_buf); =20 -struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long ad= dr, - size_t length, u32 flags) +static struct tee_shm * +register_shm_helper(struct tee_context *ctx, unsigned long addr, + size_t length, u32 flags, int id) { struct tee_device *teedev =3D ctx->teedev; - const u32 req_user_flags =3D TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED; - const u32 req_kernel_flags =3D TEE_SHM_DMA_BUF | TEE_SHM_KERNEL_MAPPED; struct tee_shm *shm; + unsigned long start; + int num_pages; void *ret; int rc; - int num_pages; - unsigned long start; - - if (flags !=3D req_user_flags && flags !=3D req_kernel_flags) - return ERR_PTR(-ENOTSUPP); =20 if (!tee_device_get(teedev)) return ERR_PTR(-EINVAL); =20 if (!teedev->desc->ops->shm_register || !teedev->desc->ops->shm_unregister) { - tee_device_put(teedev); - return ERR_PTR(-ENOTSUPP); + ret =3D ERR_PTR(-ENOTSUPP); + goto err_dev_put; } =20 teedev_ctx_get(ctx); @@ -218,13 +240,13 @@ struct tee_shm *tee_shm_register(struct tee_context *= ctx, unsigned long addr, shm =3D kzalloc(sizeof(*shm), GFP_KERNEL); if (!shm) { ret =3D ERR_PTR(-ENOMEM); - goto err; + goto err_ctx_put; } =20 refcount_set(&shm->refcount, 1); - shm->flags =3D flags | TEE_SHM_REGISTER; + shm->flags =3D flags; shm->ctx =3D ctx; - shm->id =3D -1; + shm->id =3D id; addr =3D untagged_addr(addr); start =3D rounddown(addr, PAGE_SIZE); shm->offset =3D addr - start; @@ -233,71 +255,45 @@ struct tee_shm *tee_shm_register(struct tee_context *= ctx, unsigned long addr, shm->pages =3D kcalloc(num_pages, sizeof(*shm->pages), GFP_KERNEL); if (!shm->pages) { ret =3D ERR_PTR(-ENOMEM); - goto err; + goto err_free_shm; } =20 - if (flags & TEE_SHM_USER_MAPPED) { + if (flags & TEE_SHM_USER_MAPPED) rc =3D pin_user_pages_fast(start, num_pages, FOLL_WRITE, shm->pages); - } else { - struct kvec *kiov; - int i; - - kiov =3D kcalloc(num_pages, sizeof(*kiov), GFP_KERNEL); - if (!kiov) { - ret =3D ERR_PTR(-ENOMEM); - goto err; - } - - for (i =3D 0; i < num_pages; i++) { - kiov[i].iov_base =3D (void *)(start + i * PAGE_SIZE); - kiov[i].iov_len =3D PAGE_SIZE; - } - - rc =3D get_kernel_pages(kiov, num_pages, 0, shm->pages); - kfree(kiov); - } + else + rc =3D shm_get_kernel_pages(start, num_pages, shm->pages); if (rc > 0) shm->num_pages =3D rc; if (rc !=3D num_pages) { if (rc >=3D 0) rc =3D -ENOMEM; ret =3D ERR_PTR(rc); - goto err; - } - - mutex_lock(&teedev->mutex); - shm->id =3D idr_alloc(&teedev->idr, shm, 1, 0, GFP_KERNEL); - mutex_unlock(&teedev->mutex); - - if (shm->id < 0) { - ret =3D ERR_PTR(shm->id); - goto err; + goto err_put_shm_pages; } =20 rc =3D teedev->desc->ops->shm_register(ctx, shm, shm->pages, shm->num_pages, start); if (rc) { ret =3D ERR_PTR(rc); - goto err; + goto err_put_shm_pages; } =20 return shm; -err: - if (shm) { - if (shm->id >=3D 0) { - mutex_lock(&teedev->mutex); - idr_remove(&teedev->idr, shm->id); - mutex_unlock(&teedev->mutex); - } - release_registered_pages(shm); - } +err_put_shm_pages: + if (flags & TEE_SHM_USER_MAPPED) + unpin_user_pages(shm->pages, shm->num_pages); + else + shm_put_kernel_pages(shm->pages, shm->num_pages); + kfree(shm->pages); +err_free_shm: kfree(shm); +err_ctx_put: teedev_ctx_put(ctx); +err_dev_put: tee_device_put(teedev); return ret; } -EXPORT_SYMBOL_GPL(tee_shm_register); =20 /** * tee_shm_register_user_buf() - Register a userspace shared memory buffer @@ -310,8 +306,35 @@ EXPORT_SYMBOL_GPL(tee_shm_register); struct tee_shm *tee_shm_register_user_buf(struct tee_context *ctx, unsigned long addr, size_t length) { - return tee_shm_register(ctx, addr, length, - TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED); + u32 flags =3D TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED | TEE_SHM_REGISTER; + struct tee_device *teedev =3D ctx->teedev; + struct tee_shm *shm; + void *ret; + int id; + + mutex_lock(&teedev->mutex); + id =3D idr_alloc(&teedev->idr, NULL, 1, 0, GFP_KERNEL); + mutex_unlock(&teedev->mutex); + if (id < 0) + return ERR_PTR(id); + + shm =3D register_shm_helper(ctx, addr, length, flags, id); + if (IS_ERR(shm)) { + mutex_lock(&teedev->mutex); + idr_remove(&teedev->idr, id); + mutex_unlock(&teedev->mutex); + return shm; + } + + mutex_lock(&teedev->mutex); + ret =3D idr_replace(&teedev->idr, shm, id); + mutex_unlock(&teedev->mutex); + if (IS_ERR(ret)) { + tee_shm_free(shm); + return ret; + } + + return shm; } =20 /** @@ -327,8 +350,9 @@ struct tee_shm *tee_shm_register_user_buf(struct tee_co= ntext *ctx, struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx, void *addr, size_t length) { - return tee_shm_register(ctx, (unsigned long)addr, length, - TEE_SHM_DMA_BUF | TEE_SHM_KERNEL_MAPPED); + u32 flags =3D TEE_SHM_REGISTER | TEE_SHM_KERNEL_MAPPED; + + return register_shm_helper(ctx, (unsigned long)addr, length, flags, -1); } EXPORT_SYMBOL_GPL(tee_shm_register_kernel_buf); =20 diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index c9d2cc32a5ed..a3b663ef0694 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -276,17 +276,6 @@ void *tee_get_drvdata(struct tee_device *teedev); struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t siz= e); struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t s= ize); =20 -/** - * tee_shm_register() - Register shared memory buffer - * @ctx: Context that registers the shared memory - * @addr: Address is userspace of the shared buffer - * @length: Length of the shared buffer - * @flags: Flags setting properties for the requested shared memory. - * - * @returns a pointer to 'struct tee_shm' - */ -struct tee_shm *tee_shm_register(struct tee_context *ctx, unsigned long ad= dr, - size_t length, u32 flags); struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx, void *addr, size_t length); =20 --=20 2.31.1 From nobody Tue Jun 30 04:49:39 2026 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 E92A5C433F5 for ; Tue, 25 Jan 2022 16:35:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1584000AbiAYQfV (ORCPT ); Tue, 25 Jan 2022 11:35:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37408 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1385381AbiAYQaA (ORCPT ); Tue, 25 Jan 2022 11:30:00 -0500 Received: from mail-lj1-x22a.google.com (mail-lj1-x22a.google.com [IPv6:2a00:1450:4864:20::22a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 65168C06173B for ; Tue, 25 Jan 2022 08:30:00 -0800 (PST) Received: by mail-lj1-x22a.google.com with SMTP id c15so11853082ljf.11 for ; Tue, 25 Jan 2022 08:30:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=R21QXj/bbTzapZcjCBdr87sf0YL59jDu7ua5W1yxSjY=; b=yW6in9A43ni7mBKos1HDPn6wKZPDEVGrPgxu02cQJB8l/e29GLF94mbjEfvClBBLf/ OFb9VtKAHzqdIzO+0DU3qi+QFAHbm78KucAKyKIhpnRUYouqPQftifucTlBH3Rf5sztD 4JWhdA/XwTH4qIP0ItlvHEuEVzNXJgdmGcF2Qw2igkbVK+EfDgmKeMVm0VFzPsoRqN+C fkyHjuze/uhhOt9u4z47fY9M3YZnW099lQ4+q8vB33119unuQ8/H/cCl96Sw7p8nCVTT 19xoxHZ5yoEMaWUWNIXw31mKUKq8h29fUmhiXQVo2XmS/kB6iR8W1sgfD+S71AlsAUIt 2cZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=R21QXj/bbTzapZcjCBdr87sf0YL59jDu7ua5W1yxSjY=; b=RtyR4pWmoX3vKixOG8sD9ESGhcnWFp1VkVQfYVmuetSx9ppOioJZ3RGaH2KKP6udmR ayxFFhCHkTCZ1lDIrIyuK8xDj/pMP2um9fwCtaPra1Fx/IRmpIfK5y/RRSQDKl0+uNUk GuB5xWV2ZFj+OjTnYE4Oe4NztV0nI/eE5ikLXgdLsNuut3Ag21kAr5v3ZduS6wxn3mrs d7U6Sf+1y80XuhVeFJlwuBD4fp3O9kMTi7VnBYHkgs0RzWrYnxqWe4cA/bdp18Xl66A0 F7FI+3vPZRT+BDXcpSv1s5sMne1GtZydtC4N+RikIfA+ln1OJSdT7xIW0wHevjkqHY7G 20UA== X-Gm-Message-State: AOAM530PE7TX9mQHWrnAJxLPR6rZ1wp0FuQuzgVJnCBEE2OS1HS99IMa nzr3uzdUFmnIRlUuJ616N7ZEPts8AoVteg== X-Google-Smtp-Source: ABdhPJyooFTLCV3wLGc1thxTqWPp3B5tQV9G3Av0fe+H6DrG8YxKD+3D1ABv0IyrPYHnAdhXKPyLwA== X-Received: by 2002:a2e:6e0b:: with SMTP id j11mr14423689ljc.3.1643128198444; Tue, 25 Jan 2022 08:29:58 -0800 (PST) Received: from jade.urgonet (h-94-254-48-165.A175.priv.bahnhof.se. [94.254.48.165]) by smtp.gmail.com with ESMTPSA id d13sm536240lfq.75.2022.01.25.08.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 08:29:58 -0800 (PST) From: Jens Wiklander To: linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org Cc: Sumit Garg , Herbert Xu , Devaraj Rangasamy , Rijo Thomas , David Howells , Tyler Hicks , Jens Wiklander Subject: [PATCH v3 12/12] tee: refactor TEE_SHM_* flags Date: Tue, 25 Jan 2022 17:29:38 +0100 Message-Id: <20220125162938.838382-13-jens.wiklander@linaro.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220125162938.838382-1-jens.wiklander@linaro.org> References: <20220125162938.838382-1-jens.wiklander@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Removes the redundant TEE_SHM_DMA_BUF, TEE_SHM_EXT_DMA_BUF, TEE_SHM_MAPPED and TEE_SHM_KERNEL_MAPPED flags. Assigns new values to the remaining flags to void gaps. Signed-off-by: Jens Wiklander --- drivers/tee/optee/smc_abi.c | 4 ++-- drivers/tee/tee_shm.c | 23 +++++++++++------------ drivers/tee/tee_shm_pool.c | 2 +- include/linux/tee_drv.h | 21 +++++++++------------ 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index 9c1c9cfb7488..0895c5146dfa 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -228,7 +228,7 @@ static int optee_to_msg_param(struct optee *optee, case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT: case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT: case TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INOUT: - if (tee_shm_is_registered(p->u.memref.shm)) + if (tee_shm_is_dynamic(p->u.memref.shm)) rc =3D to_msg_param_reg_mem(mp, p); else rc =3D to_msg_param_tmp_mem(mp, p); @@ -669,7 +669,7 @@ static void handle_rpc_func_cmd_shm_alloc(struct tee_co= ntext *ctx, =20 sz =3D tee_shm_get_size(shm); =20 - if (tee_shm_is_registered(shm)) { + if (tee_shm_is_dynamic(shm)) { struct page **pages; u64 *pages_list; size_t page_num; diff --git a/drivers/tee/tee_shm.c b/drivers/tee/tee_shm.c index c3a29022ec72..d9deb1f50022 100644 --- a/drivers/tee/tee_shm.c +++ b/drivers/tee/tee_shm.c @@ -58,7 +58,7 @@ static void tee_shm_release(struct tee_device *teedev, st= ruct tee_shm *shm) { if (shm->flags & TEE_SHM_POOL) { teedev->pool->ops->free(teedev->pool, shm); - } else if (shm->flags & TEE_SHM_REGISTER) { + } else if (shm->flags & TEE_SHM_DYNAMIC) { int rc =3D teedev->desc->ops->shm_unregister(shm->ctx, shm); =20 if (rc) @@ -139,8 +139,7 @@ static struct tee_shm *shm_alloc_helper(struct tee_cont= ext *ctx, size_t size, */ struct tee_shm *tee_shm_alloc_user_buf(struct tee_context *ctx, size_t siz= e) { - u32 flags =3D TEE_SHM_MAPPED | TEE_SHM_DMA_BUF | TEE_SHM_REGISTER | - TEE_SHM_POOL; + u32 flags =3D TEE_SHM_DYNAMIC | TEE_SHM_POOL; struct tee_device *teedev =3D ctx->teedev; struct tee_shm *shm; void *ret; @@ -185,7 +184,7 @@ struct tee_shm *tee_shm_alloc_user_buf(struct tee_conte= xt *ctx, size_t size) */ struct tee_shm *tee_shm_alloc_kernel_buf(struct tee_context *ctx, size_t s= ize) { - u32 flags =3D TEE_SHM_MAPPED | TEE_SHM_REGISTER | TEE_SHM_POOL; + u32 flags =3D TEE_SHM_DYNAMIC | TEE_SHM_POOL; =20 return shm_alloc_helper(ctx, size, PAGE_SIZE, flags, -1); } @@ -209,7 +208,7 @@ EXPORT_SYMBOL_GPL(tee_shm_alloc_kernel_buf); */ struct tee_shm *tee_shm_alloc_priv_buf(struct tee_context *ctx, size_t siz= e) { - u32 flags =3D TEE_SHM_MAPPED | TEE_SHM_PRIV | TEE_SHM_POOL; + u32 flags =3D TEE_SHM_PRIV | TEE_SHM_POOL; =20 return shm_alloc_helper(ctx, size, sizeof(long) * 2, flags, -1); } @@ -306,7 +305,7 @@ register_shm_helper(struct tee_context *ctx, unsigned l= ong addr, struct tee_shm *tee_shm_register_user_buf(struct tee_context *ctx, unsigned long addr, size_t length) { - u32 flags =3D TEE_SHM_DMA_BUF | TEE_SHM_USER_MAPPED | TEE_SHM_REGISTER; + u32 flags =3D TEE_SHM_USER_MAPPED | TEE_SHM_DYNAMIC; struct tee_device *teedev =3D ctx->teedev; struct tee_shm *shm; void *ret; @@ -350,7 +349,7 @@ struct tee_shm *tee_shm_register_user_buf(struct tee_co= ntext *ctx, struct tee_shm *tee_shm_register_kernel_buf(struct tee_context *ctx, void *addr, size_t length) { - u32 flags =3D TEE_SHM_REGISTER | TEE_SHM_KERNEL_MAPPED; + u32 flags =3D TEE_SHM_DYNAMIC; =20 return register_shm_helper(ctx, (unsigned long)addr, length, flags, -1); } @@ -394,7 +393,7 @@ int tee_shm_get_fd(struct tee_shm *shm) { int fd; =20 - if (!(shm->flags & TEE_SHM_DMA_BUF)) + if (shm->id < 0) return -EINVAL; =20 /* matched by tee_shm_put() in tee_shm_op_release() */ @@ -424,7 +423,7 @@ EXPORT_SYMBOL_GPL(tee_shm_free); */ int tee_shm_va2pa(struct tee_shm *shm, void *va, phys_addr_t *pa) { - if (!(shm->flags & TEE_SHM_MAPPED)) + if (!shm->kaddr) return -EINVAL; /* Check that we're in the range of the shm */ if ((char *)va < (char *)shm->kaddr) @@ -446,7 +445,7 @@ EXPORT_SYMBOL_GPL(tee_shm_va2pa); */ int tee_shm_pa2va(struct tee_shm *shm, phys_addr_t pa, void **va) { - if (!(shm->flags & TEE_SHM_MAPPED)) + if (!shm->kaddr) return -EINVAL; /* Check that we're in the range of the shm */ if (pa < shm->paddr) @@ -474,7 +473,7 @@ EXPORT_SYMBOL_GPL(tee_shm_pa2va); */ void *tee_shm_get_va(struct tee_shm *shm, size_t offs) { - if (!(shm->flags & TEE_SHM_MAPPED)) + if (!shm->kaddr) return ERR_PTR(-EINVAL); if (offs >=3D shm->size) return ERR_PTR(-EINVAL); @@ -549,7 +548,7 @@ void tee_shm_put(struct tee_shm *shm) * the refcount_inc() in tee_shm_get_from_id() never starts * from 0. */ - if (shm->flags & TEE_SHM_DMA_BUF) + if (shm->id >=3D 0) idr_remove(&teedev->idr, shm->id); do_release =3D true; } diff --git a/drivers/tee/tee_shm_pool.c b/drivers/tee/tee_shm_pool.c index 71e0f8ae69aa..058bfbac657a 100644 --- a/drivers/tee/tee_shm_pool.c +++ b/drivers/tee/tee_shm_pool.c @@ -30,7 +30,7 @@ static int pool_op_gen_alloc(struct tee_shm_pool *pool, s= truct tee_shm *shm, * This is from a static shared memory pool so no need to register * each chunk, and no need to unregister later either. */ - shm->flags &=3D ~TEE_SHM_REGISTER; + shm->flags &=3D ~TEE_SHM_DYNAMIC; return 0; } =20 diff --git a/include/linux/tee_drv.h b/include/linux/tee_drv.h index a3b663ef0694..911cad324acc 100644 --- a/include/linux/tee_drv.h +++ b/include/linux/tee_drv.h @@ -20,14 +20,11 @@ * specific TEE driver. */ =20 -#define TEE_SHM_MAPPED BIT(0) /* Memory mapped by the kernel */ -#define TEE_SHM_DMA_BUF BIT(1) /* Memory with dma-buf handle */ -#define TEE_SHM_EXT_DMA_BUF BIT(2) /* Memory with dma-buf handle */ -#define TEE_SHM_REGISTER BIT(3) /* Memory registered in secure world */ -#define TEE_SHM_USER_MAPPED BIT(4) /* Memory mapped in user space */ -#define TEE_SHM_POOL BIT(5) /* Memory allocated from pool */ -#define TEE_SHM_KERNEL_MAPPED BIT(6) /* Memory mapped in kernel space */ -#define TEE_SHM_PRIV BIT(7) /* Memory private to TEE driver */ +#define TEE_SHM_DYNAMIC BIT(0) /* Dynamic shared memory registered */ + /* in secure world */ +#define TEE_SHM_USER_MAPPED BIT(1) /* Memory mapped in user space */ +#define TEE_SHM_POOL BIT(2) /* Memory allocated from pool */ +#define TEE_SHM_PRIV BIT(3) /* Memory private to TEE driver */ =20 struct device; struct tee_device; @@ -280,13 +277,13 @@ struct tee_shm *tee_shm_register_kernel_buf(struct te= e_context *ctx, void *addr, size_t length); =20 /** - * tee_shm_is_registered() - Check if shared memory object in registered i= n TEE + * tee_shm_is_dynamic() - Check if shared memory object is of the dynamic = kind * @shm: Shared memory handle - * @returns true if object is registered in TEE + * @returns true if object is dynamic shared memory */ -static inline bool tee_shm_is_registered(struct tee_shm *shm) +static inline bool tee_shm_is_dynamic(struct tee_shm *shm) { - return shm && (shm->flags & TEE_SHM_REGISTER); + return shm && (shm->flags & TEE_SHM_DYNAMIC); } =20 /** --=20 2.31.1