Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3138113pxj; Mon, 14 Jun 2021 15:36:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxMAyd9zalnPRaGGQ9m7C3tPCrRaI/vMnv0O2sBF32DzBXQ6ZCAbs7XTprbl2xnikUc6oiS X-Received: by 2002:a05:6402:cb5:: with SMTP id cn21mr19450746edb.164.1623710172186; Mon, 14 Jun 2021 15:36:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623710172; cv=none; d=google.com; s=arc-20160816; b=phDujutTRnHHqoLjysIpiF7aadPmuWC+J+kR8oLjA8EpsFJM7aBYnY43xcYQghzeVw Ffrt0OholhGqwTNwSgfZbb48HLapPjQf/y56ylPWUp1yA3clXgVgXGAqKdL6u8CJPstX +9V39ZgorokeGtx9gaYBByyvJN3gQZX7/t56sQeF1/QzuW6qro0axWzUb5kfdUlZy6GV uzkRVWOYKHFwnhoDMOSRQeFt67WzZSMgorgXoCGBBhqIiLB2iNC9pqeby0ujumxX3nSQ 3mR6nMEA4rfo9hh/JzLSHZuDtezBRRKxfaABjWKJ8nu9f+1jjk8qCmR8XaTkD0qHhQw4 R3Ng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-filter; bh=+7MH9Xtj9mskeZwii9V+pPHBx5m8KRDfBlEtbXI2NfY=; b=yc6dfKP1BtuBjLa9680d1dwV8B586ewcHpVn+uugGvWgHRG5rMEXABt8mQwU00wPy7 3yG20ofLmkzMFGGFMLxVKo64xAl5tUxmgUU1e2Q7zFYMXAX1SD2NXiHoM0xeB4HdxAju gntu1+WmJecWxMtbSzah4h1gFO3drsBdyAl36i+GvQqdwwxaPJaYD4ZGtxgWB+BAwp89 Opaf00dhOBfLllIhTwVotXqJucamhtNH4hoLOX1cljTY0GwgTPUFeVbivgaBdPXodwhI mU3tYhEzSSXrAnZ/QsJNZ1966hI15tM8fXEiKufJ4ByCf08RcgJsDJnbk3U2AkpBdKHZ OJCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=LU+dtEmd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f27si12786097ejl.134.2021.06.14.15.35.49; Mon, 14 Jun 2021 15:36:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=LU+dtEmd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231821AbhFNWfz (ORCPT + 99 others); Mon, 14 Jun 2021 18:35:55 -0400 Received: from linux.microsoft.com ([13.77.154.182]:56216 "EHLO linux.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231664AbhFNWfs (ORCPT ); Mon, 14 Jun 2021 18:35:48 -0400 Received: from sequoia.work.tihix.com (162-237-133-238.lightspeed.rcsntx.sbcglobal.net [162.237.133.238]) by linux.microsoft.com (Postfix) with ESMTPSA id B5AD820B83C2; Mon, 14 Jun 2021 15:33:43 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com B5AD820B83C2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1623710024; bh=+7MH9Xtj9mskeZwii9V+pPHBx5m8KRDfBlEtbXI2NfY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LU+dtEmdhSdE7Zg7MHVscA5+NoQe8V4BUZD/Y9iXeyJpeVVCTX0gALrM8dhBlFdU/ f5eOhviyg/TO9xtWvFXupJN0jJqC04QKjBaswY/MAUxmAJIVsSizS+dlBhYaheDu0p +EsIr4SMjXeH+kPwWCR3xEImOG7ElFe1lszu9PNE= From: Tyler Hicks To: Jens Wiklander , Allen Pais , Sumit Garg , Peter Huewe , Jarkko Sakkinen , Jason Gunthorpe , Vikas Gupta Cc: Thirupathaiah Annapureddy , Pavel Tatashin , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , op-tee@lists.trustedfirmware.org, linux-integrity@vger.kernel.org, bcm-kernel-feedback-list@broadcom.com, linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 8/8] firmware: tee_bnxt: Release TEE shm, session, and context during kexec Date: Mon, 14 Jun 2021 17:33:17 -0500 Message-Id: <20210614223317.999867-9-tyhicks@linux.microsoft.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210614223317.999867-1-tyhicks@linux.microsoft.com> References: <20210614223317.999867-1-tyhicks@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Allen Pais Implement a .shutdown hook that will be called during a kexec operation so that the TEE shared memory, session, and context that were set up during .probe can be properly freed/closed. Additionally, don't use dma-buf backed shared memory for the fw_shm_pool. dma-buf backed shared memory cannot be reliably freed and unregistered during a kexec operation even when tee_shm_free() is called on the shm from a .shutdown hook. The problem occurs because dma_buf_put() calls fput() which then uses task_work_add(), with the TWA_RESUME parameter, to queue tee_shm_release() to be called before the current task returns to user mode. However, the current task never returns to user mode before the kexec completes so the memory is never freed nor unregistered. Use tee_shm_alloc_kernel_buf() to avoid dma-buf backed shared memory allocation so that tee_shm_free() can directly call tee_shm_release(). This will ensure that the shm can be freed and unregistered during a kexec operation. Fixes: 246880958ac9 ("firmware: broadcom: add OP-TEE based BNXT f/w manager") Cc: stable@vger.kernel.org Signed-off-by: Allen Pais Co-developed-by: Tyler Hicks Signed-off-by: Tyler Hicks --- drivers/firmware/broadcom/tee_bnxt_fw.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/firmware/broadcom/tee_bnxt_fw.c b/drivers/firmware/broadcom/tee_bnxt_fw.c index ed10da5313e8..a5bf4c3f6dc7 100644 --- a/drivers/firmware/broadcom/tee_bnxt_fw.c +++ b/drivers/firmware/broadcom/tee_bnxt_fw.c @@ -212,10 +212,9 @@ static int tee_bnxt_fw_probe(struct device *dev) pvt_data.dev = dev; - fw_shm_pool = tee_shm_alloc(pvt_data.ctx, MAX_SHM_MEM_SZ, - TEE_SHM_MAPPED | TEE_SHM_DMA_BUF); + fw_shm_pool = tee_shm_alloc_kernel_buf(pvt_data.ctx, MAX_SHM_MEM_SZ); if (IS_ERR(fw_shm_pool)) { - dev_err(pvt_data.dev, "tee_shm_alloc failed\n"); + dev_err(pvt_data.dev, "tee_shm_alloc_kernel_buf failed\n"); err = PTR_ERR(fw_shm_pool); goto out_sess; } @@ -242,6 +241,14 @@ static int tee_bnxt_fw_remove(struct device *dev) return 0; } +static void tee_bnxt_fw_shutdown(struct device *dev) +{ + tee_shm_free(pvt_data.fw_shm_pool); + tee_client_close_session(pvt_data.ctx, pvt_data.session_id); + tee_client_close_context(pvt_data.ctx); + pvt_data.ctx = NULL; +} + static const struct tee_client_device_id tee_bnxt_fw_id_table[] = { {UUID_INIT(0x6272636D, 0x2019, 0x0716, 0x42, 0x43, 0x4D, 0x5F, 0x53, 0x43, 0x48, 0x49)}, @@ -257,6 +264,7 @@ static struct tee_client_driver tee_bnxt_fw_driver = { .bus = &tee_bus_type, .probe = tee_bnxt_fw_probe, .remove = tee_bnxt_fw_remove, + .shutdown = tee_bnxt_fw_shutdown, }, }; -- 2.25.1