From nobody Sat Feb 7 07:35:32 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 88FC6CA0ECA for ; Tue, 12 Sep 2023 13:00:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235334AbjILNAK (ORCPT ); Tue, 12 Sep 2023 09:00:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235339AbjILM77 (ORCPT ); Tue, 12 Sep 2023 08:59:59 -0400 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.115]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A086510D8 for ; Tue, 12 Sep 2023 05:59:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1694523595; x=1726059595; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=uWBODskc0U2+ZZHSwiVmG/haTZP+gN8VzdgvjDqfqdE=; b=ef+P3D9nrT1m2ExT6RdxbbnddiVWLvD/uMqP0qIjeJBxQnaDPDoTTYRv XUkTfTwhzz8UDC3+MV3k/cQU6AAXwIhE/dg0Xi38WhSm+5vQDclpSZrLG 0HF8iOJMB/x4RSSfA1xnajEu+naI0pjSim+Lh2biyYasvM+xVAHUGfeB6 WQKbg8x/DoOGUhK+hGGCpBICIwdeeNFmD02xR0EOTvtf9Sd9PTsjmuZss 5ozt6/YXXjKiVsV3TX6uyyCdhD9FodJ9p0C/Gisx2spF1Kf/OFvui6uS/ Y0iay/9scLLshvh6pdtj0bJT01RcHZ/Cjc5sPJT137abNCXJoLOFVbJhi g==; X-IronPort-AV: E=McAfee;i="6600,9927,10831"; a="378277321" X-IronPort-AV: E=Sophos;i="6.02,139,1688454000"; d="scan'208";a="378277321" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Sep 2023 05:59:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10831"; a="858799310" X-IronPort-AV: E=Sophos;i="6.02,139,1688454000"; d="scan'208";a="858799310" Received: from tongshi-mobl.ccr.corp.intel.com (HELO tinazhan-desk1.intel.com) ([10.255.28.214]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Sep 2023 05:59:53 -0700 From: Tina Zhang To: Jason Gunthorpe , Kevin Tian , Lu Baolu Cc: Michael Shavit , Vasant Hegde , iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Tina Zhang Subject: [PATCH v4 3/6] iommu: Introduce mm_get_pasid() helper function Date: Tue, 12 Sep 2023 20:59:33 +0800 Message-Id: <20230912125936.722348-4-tina.zhang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230912125936.722348-1-tina.zhang@intel.com> References: <20230912125936.722348-1-tina.zhang@intel.com> 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" Use the helper function mm_get_pasid() to get a mm assigned pasid value. The motivation is to replace mm->pasid with an iommu private data structure that is introduced in a later patch. Reviewed-by: Lu Baolu Signed-off-by: Tina Zhang --- Changes in v4: - Rebase to v6.6-rc1. Changes in v2: - Update commit message. - Let mm_get_enqcmd_pasid() call mm_get_pasid() to get pasid. drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 12 ++++++------ drivers/iommu/iommu-sva.c | 12 ++++++------ include/linux/iommu.h | 10 +++++++++- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iomm= u/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 4d83edc2be99..dbb3af323ede 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -215,7 +215,7 @@ static void arm_smmu_mm_arch_invalidate_secondary_tlbs(= struct mmu_notifier *mn, smmu_domain); } =20 - arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, start, size); + arm_smmu_atc_inv_domain(smmu_domain, mm_get_pasid(mm), start, size); } =20 static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct = *mm) @@ -233,10 +233,10 @@ static void arm_smmu_mm_release(struct mmu_notifier *= mn, struct mm_struct *mm) * DMA may still be running. Keep the cd valid to avoid C_BAD_CD events, * but disable translation. */ - arm_smmu_write_ctx_desc(smmu_domain, mm->pasid, &quiet_cd); + arm_smmu_write_ctx_desc(smmu_domain, mm_get_pasid(mm), &quiet_cd); =20 arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_mn->cd->asid); - arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, 0, 0); + arm_smmu_atc_inv_domain(smmu_domain, mm_get_pasid(mm), 0, 0); =20 smmu_mn->cleared =3D true; mutex_unlock(&sva_lock); @@ -290,7 +290,7 @@ arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_= domain, goto err_free_cd; } =20 - ret =3D arm_smmu_write_ctx_desc(smmu_domain, mm->pasid, cd); + ret =3D arm_smmu_write_ctx_desc(smmu_domain, mm_get_pasid(mm), cd); if (ret) goto err_put_notifier; =20 @@ -315,7 +315,7 @@ static void arm_smmu_mmu_notifier_put(struct arm_smmu_m= mu_notifier *smmu_mn) return; =20 list_del(&smmu_mn->list); - arm_smmu_write_ctx_desc(smmu_domain, mm->pasid, NULL); + arm_smmu_write_ctx_desc(smmu_domain, mm_get_pasid(mm), NULL); =20 /* * If we went through clear(), we've already invalidated, and no @@ -323,7 +323,7 @@ static void arm_smmu_mmu_notifier_put(struct arm_smmu_m= mu_notifier *smmu_mn) */ if (!smmu_mn->cleared) { arm_smmu_tlb_inv_asid(smmu_domain->smmu, cd->asid); - arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, 0, 0); + arm_smmu_atc_inv_domain(smmu_domain, mm_get_pasid(mm), 0, 0); } =20 /* Frees smmu_mn */ diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c index b78671a8a914..0f956ecd0c9b 100644 --- a/drivers/iommu/iommu-sva.c +++ b/drivers/iommu/iommu-sva.c @@ -23,7 +23,7 @@ static int iommu_sva_alloc_pasid(struct mm_struct *mm, st= ruct device *dev) mutex_lock(&iommu_sva_lock); /* Is a PASID already associated with this mm? */ if (mm_valid_pasid(mm)) { - if (mm->pasid >=3D dev->iommu->max_pasids) + if (mm_get_pasid(mm) >=3D dev->iommu->max_pasids) ret =3D -EOVERFLOW; goto out; } @@ -73,7 +73,7 @@ struct iommu_sva *iommu_sva_bind_device(struct device *de= v, struct mm_struct *mm =20 mutex_lock(&iommu_sva_lock); /* Search for an existing domain. */ - domain =3D iommu_get_domain_for_dev_pasid(dev, mm->pasid, + domain =3D iommu_get_domain_for_dev_pasid(dev, mm_get_pasid(mm), IOMMU_DOMAIN_SVA); if (IS_ERR(domain)) { ret =3D PTR_ERR(domain); @@ -92,7 +92,7 @@ struct iommu_sva *iommu_sva_bind_device(struct device *de= v, struct mm_struct *mm goto out_unlock; } =20 - ret =3D iommu_attach_device_pasid(domain, dev, mm->pasid); + ret =3D iommu_attach_device_pasid(domain, dev, mm_get_pasid(mm)); if (ret) goto out_free_domain; domain->users =3D 1; @@ -124,7 +124,7 @@ EXPORT_SYMBOL_GPL(iommu_sva_bind_device); void iommu_sva_unbind_device(struct iommu_sva *handle) { struct iommu_domain *domain =3D handle->domain; - ioasid_t pasid =3D domain->mm->pasid; + ioasid_t pasid =3D mm_get_pasid(domain->mm); struct device *dev =3D handle->dev; =20 mutex_lock(&iommu_sva_lock); @@ -141,7 +141,7 @@ u32 iommu_sva_get_pasid(struct iommu_sva *handle) { struct iommu_domain *domain =3D handle->domain; =20 - return domain->mm->pasid; + return mm_get_pasid(domain->mm); } EXPORT_SYMBOL_GPL(iommu_sva_get_pasid); =20 @@ -208,5 +208,5 @@ void mm_pasid_drop(struct mm_struct *mm) if (likely(!mm_valid_pasid(mm))) return; =20 - iommu_free_global_pasid(mm->pasid); + iommu_free_global_pasid(mm_get_pasid(mm)); } diff --git a/include/linux/iommu.h b/include/linux/iommu.h index a4eab6697fe1..db2510da28c1 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -1189,10 +1189,14 @@ static inline bool mm_valid_pasid(struct mm_struct = *mm) { return mm->pasid !=3D IOMMU_PASID_INVALID; } -static inline u32 mm_get_enqcmd_pasid(struct mm_struct *mm) +static inline u32 mm_get_pasid(struct mm_struct *mm) { return mm->pasid; } +static inline u32 mm_get_enqcmd_pasid(struct mm_struct *mm) +{ + return mm_get_pasid(mm); +} void mm_pasid_drop(struct mm_struct *mm); struct iommu_sva *iommu_sva_bind_device(struct device *dev, struct mm_struct *mm); @@ -1215,6 +1219,10 @@ static inline u32 iommu_sva_get_pasid(struct iommu_s= va *handle) } static inline void mm_pasid_init(struct mm_struct *mm) {} static inline bool mm_valid_pasid(struct mm_struct *mm) { return false; } +static inline u32 mm_get_pasid(struct mm_struct *mm) +{ + return IOMMU_PASID_INVALID; +} static inline u32 mm_get_enqcmd_pasid(struct mm_struct *mm) { return IOMMU_PASID_INVALID; --=20 2.34.1