Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp41080pxj; Thu, 10 Jun 2021 14:12:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxBvSiYAUsKRup/LCZCTZZhtmOR1iK2if3diQPVNxxymq9fms0B0NC581v2EklYAK9Dzpxr X-Received: by 2002:a17:906:179b:: with SMTP id t27mr457585eje.70.1623359535234; Thu, 10 Jun 2021 14:12:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623359535; cv=none; d=google.com; s=arc-20160816; b=bfZg/d/PW073xVnrhLpy8WQSn+4u0XcJjYRJpZb8oK1Eh2ilj0I1WfNNjEa315tlv1 Yq/oAGMAelo4szUCSsztJeEYK93Z3fnyM6UOTV98mx/GVAU/XmChrG424QmKm7rC3IUp 4sXFbCb6JhElPbjw8CYgmOAlx2eAdWk/4Mbg1RQMQ7zquVORLbceCj+OeJIt/5p/TjfR 2P/UwdinuWeXkePPoopDkL2E0mq3H8ocx+RYRFE9cuaPaoSo7xE+Db+7q6vSqBaGvfGd PM2Z1Ta/IuAY4qt6iRO4Qmp6+LuXXMKhzWtHY5tXK/mYEoP1g7N3W3ZfO5jSsz1VziWR zo0A== 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=3AkzjPDle5pDg2xwxx73EHJTuFLG/FBLbuCVbDMwXys=; b=YMLgkWHzSarASOXr93e13oJLgPJflNB0S7d7181Ev8ftHhbaVWKqsbQmtOkDZ1QLW/ jWcVHxUcny4zkrLl1nb/P+6EKhUVwdyox+2GhwQplZolM5ECPmJ+IOLqGAQ/JCNAdb3o GMDjsuMF+EahzbcrlKbjoq07AcM2VwIb6QRCtOtN7iyKMZt3DM9Fr1wTbjW+w/24w2kF w+Le/sJH3TJwez4ttzWKSvf1uIv6ajEUrjkzYKvD2r81gHoCeNjHfek0NUOLTDbFlmxX H56ZwJ4417O07gAzg1ObnDFcVgVE2wMHBh8/ipWUnEOE7EiZFFrnMse7El0WuuoGLPCK ebnA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b="JNUuI/md"; 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 a16si3006513edy.330.2021.06.10.14.11.51; Thu, 10 Jun 2021 14:12:15 -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="JNUuI/md"; 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 S231196AbhFJVMF (ORCPT + 99 others); Thu, 10 Jun 2021 17:12:05 -0400 Received: from linux.microsoft.com ([13.77.154.182]:60598 "EHLO linux.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231143AbhFJVLw (ORCPT ); Thu, 10 Jun 2021 17:11:52 -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 CCE8720B7188; Thu, 10 Jun 2021 14:09:54 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com CCE8720B7188 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1623359395; bh=3AkzjPDle5pDg2xwxx73EHJTuFLG/FBLbuCVbDMwXys=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JNUuI/mdWDJ1NMEp1b6ythmOtQDckHJlMtuCE0pv0xNPxGMsXQMvw1GNIbuAtUX5A JcqEZ0tg2K19EKEkTc/Gaqg/zvam7nPhrytPoORlMbDLIkYoNpBYVtGiDzQQPwc+jm X6cxan64tV76eWmX646Fz2dV4Q/ofREsv/jXYtKE= 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 v4 8/8] firmware: tee_bnxt: Release TEE shm, session, and context during kexec Date: Thu, 10 Jun 2021 16:09:13 -0500 Message-Id: <20210610210913.536081-9-tyhicks@linux.microsoft.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210610210913.536081-1-tyhicks@linux.microsoft.com> References: <20210610210913.536081-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") 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