Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp996911rwr; Thu, 27 Apr 2023 10:48:40 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7Sw3D8bG10/w2t2CMqmfgTsBLO3x5efQyRs0LyLIpygKuYthpbCCKCoMVJarDzeALFw/rB X-Received: by 2002:a17:902:c745:b0:1a6:6fe3:df91 with SMTP id q5-20020a170902c74500b001a66fe3df91mr1855025plq.50.1682617720495; Thu, 27 Apr 2023 10:48:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682617720; cv=none; d=google.com; s=arc-20160816; b=YDSCe9Prtd5BF7BwXXwJ4wZKMBmHHxLwM8HIq3XnRTv4NfEISMJ4jasjw9tVwLDcKE uHmUJpAqCQq66pmh0I4KPE9tDDxYtjKGbpVHiZG12l0q6tUMbGC+PIRkBXp07SGrK5yN dXItpg/49EDO0ba5kdJ6FNlp351cBQq8SPJ5upWu8e0xiUdBkhrur60/YjlzSVhTdxXc KgtEkMZAo+W/KrfhyPVao8n4Bra6LmUM7TIPpKC7KNSU4sP7DIbIibj5fgVnu2AJsI03 H2GehJH2w4VqTyG1Lr+zRFufaWmF8WMGn1m/vGtsFl2LZNuOktIs3dfl1OppY7nHxd2U llDw== 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; bh=R44G7MVMj6XwC1kj9HXKLP1DvP6EIEPL9eS7gUvVBEo=; b=QTmdhNHddAQ5fTvO5H9lWX17a7Q/aPy4wB4UwW39S99mkQAXpUXy5FpRa5wN8TJ3ky mgJPfCcVHG3EuhBQ+qBp9r7xrMfxhQjLHHsy1WCOBm7ZA8m6jFZxtKcxPCILlnswFCF9 w8VNG2bCHOJTN7ONrsa4gS+wYWKrJ+Sh078MX3F9QWQYbR8fTSAOrbnSsMuVZr8b79QS dNwj98GlebymXxxk+/pDlCpOoZF+CdowTwvKkSSocQB67VCOwWGI436IMA1lA1FPmMNA ueNSA5kpiUVW0/3U+1S2A/fF1rUr74rReHj6gjU6sE8spqTslUOXpuLj6lVaJb2GFyKp V2Bw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CS+q3CsG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h8-20020a170902680800b001a27f94808csi19817282plk.518.2023.04.27.10.48.28; Thu, 27 Apr 2023 10:48:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CS+q3CsG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244520AbjD0RqF (ORCPT + 99 others); Thu, 27 Apr 2023 13:46:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244467AbjD0Rpn (ORCPT ); Thu, 27 Apr 2023 13:45:43 -0400 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE73519AF; Thu, 27 Apr 2023 10:45:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1682617539; x=1714153539; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=lY3IbcJ95ptI2b6AsAi5VBnI+hX0sOT8ivCaRI929i8=; b=CS+q3CsGYm5z4KSOIisV96V/r/DFhS9UmfJFcZ+QP232ffPSai+Wd97K RxwJtxn9qbqzQm4JQQS2YFx7Qusw0DbsXxvknuTVP3z/S0S2OyITcHPwp oYoHDiQK6zJ9xgFR5G4lCwHNTZx49H72FetoAkmUimTVGnmaWzMa7S1kz /HCyKm6Sx2arD1/5qLxoqum7pkGxoLmsi+TrPJVMhA1wjwE6L04qUbaAs kcL/U0M4ce5IaYToJJuSFObdWpErhnho862dTGV+zoNL7yfOc+9elcOBV aIrp1x68uQzJigrTKxHC0ytZ6MpeZcczIFUSjxBli83mrjrSS9pdX0zit g==; X-IronPort-AV: E=McAfee;i="6600,9927,10693"; a="350398718" X-IronPort-AV: E=Sophos;i="5.99,232,1677571200"; d="scan'208";a="350398718" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Apr 2023 10:45:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10693"; a="1024219704" X-IronPort-AV: E=Sophos;i="5.99,232,1677571200"; d="scan'208";a="1024219704" Received: from srinivas-otcpl-7600.jf.intel.com (HELO jacob-builder.jf.intel.com) ([10.54.39.106]) by fmsmga005.fm.intel.com with ESMTP; 27 Apr 2023 10:45:21 -0700 From: Jacob Pan To: LKML , iommu@lists.linux.dev, "Robin Murphy" , Jason Gunthorpe , "Lu Baolu" , Joerg Roedel , dmaengine@vger.kernel.org, vkoul@kernel.org Cc: "Will Deacon" , David Woodhouse , Raj Ashok , "Tian, Kevin" , Yi Liu , "Yu, Fenghua" , Dave Jiang , Tony Luck , "Zanussi, Tom" , narayan.ranganathan@intel.com, Jacob Pan Subject: [PATCH v5 3/7] iommu: Move global PASID allocation from SVA to core Date: Thu, 27 Apr 2023 10:49:33 -0700 Message-Id: <20230427174937.471668-4-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230427174937.471668-1-jacob.jun.pan@linux.intel.com> References: <20230427174937.471668-1-jacob.jun.pan@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Devices that use Intel ENQCMD to submit work must use global PASIDs in that the PASID are stored in a per CPU MSR. When such device need to submit work for in-kernel DMA with PASID, it must allocate PASIDs from the same global number space to avoid conflict. This patch moves global PASID allocation APIs from SVA to IOMMU APIs. It is expected that device drivers will use the allocated PASIDs to attach to appropriate IOMMU domains for use. Signed-off-by: Jacob Pan --- v5: move PASID range check inside API so that device drivers only pass in struct device* (Kevin) v4: move dummy functions outside ifdef CONFIG_IOMMU_SVA (Baolu) --- drivers/iommu/iommu-sva.c | 25 ++++++------------------- drivers/iommu/iommu.c | 24 ++++++++++++++++++++++++ include/linux/iommu.h | 9 +++++++++ 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c index ac7c93bacb5c..f07997b37cea 100644 --- a/drivers/iommu/iommu-sva.c +++ b/drivers/iommu/iommu-sva.c @@ -9,27 +9,19 @@ #include "iommu-sva.h" static DEFINE_MUTEX(iommu_sva_lock); -static DEFINE_IDA(iommu_global_pasid_ida); /* Allocate a PASID for the mm within range (inclusive) */ -static int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max) +static int iommu_sva_alloc_pasid(struct mm_struct *mm, struct device *dev) { int ret = 0; - if (!pasid_valid(min) || !pasid_valid(max) || - min == 0 || max < min) - return -EINVAL; - mutex_lock(&iommu_sva_lock); /* Is a PASID already associated with this mm? */ - if (pasid_valid(mm->pasid)) { - if (mm->pasid < min || mm->pasid > max) - ret = -EOVERFLOW; + if (pasid_valid(mm->pasid)) goto out; - } - ret = ida_alloc_range(&iommu_global_pasid_ida, min, max, GFP_KERNEL); - if (ret < min) + ret = iommu_alloc_global_pasid_dev(dev); + if (!pasid_valid(ret)) goto out; mm->pasid = ret; ret = 0; @@ -58,15 +50,10 @@ struct iommu_sva *iommu_sva_bind_device(struct device *dev, struct mm_struct *mm { struct iommu_domain *domain; struct iommu_sva *handle; - ioasid_t max_pasids; int ret; - max_pasids = dev->iommu->max_pasids; - if (!max_pasids) - return ERR_PTR(-EOPNOTSUPP); - /* Allocate mm->pasid if necessary. */ - ret = iommu_sva_alloc_pasid(mm, IOMMU_DEF_RID_PASID + 1, max_pasids - 1); + ret = iommu_sva_alloc_pasid(mm, dev); if (ret) return ERR_PTR(ret); @@ -211,5 +198,5 @@ void mm_pasid_drop(struct mm_struct *mm) if (likely(!pasid_valid(mm->pasid))) return; - ida_free(&iommu_global_pasid_ida, mm->pasid); + iommu_free_global_pasid(mm->pasid); } diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 10db680acaed..6314513c00e6 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -38,6 +38,7 @@ static struct kset *iommu_group_kset; static DEFINE_IDA(iommu_group_ida); +static DEFINE_IDA(iommu_global_pasid_ida); static unsigned int iommu_def_domain_type __read_mostly; static bool iommu_dma_strict __read_mostly = IS_ENABLED(CONFIG_IOMMU_DEFAULT_DMA_STRICT); @@ -3450,3 +3451,26 @@ struct iommu_domain *iommu_sva_domain_alloc(struct device *dev, return domain; } + +ioasid_t iommu_alloc_global_pasid_dev(struct device *dev) +{ + int ret; + ioasid_t max; + + max = dev_iommu_get_max_pasids(dev); + ret = ida_alloc_range(&iommu_global_pasid_ida, IOMMU_DEF_RID_PASID + 1, max, GFP_KERNEL); + if (ret < 0) + return IOMMU_PASID_INVALID; + + return ret; +} +EXPORT_SYMBOL_GPL(iommu_alloc_global_pasid_dev); + +void iommu_free_global_pasid(ioasid_t pasid) +{ + if (WARN_ON(!pasid_valid(pasid))) + return; + + ida_free(&iommu_global_pasid_ida, pasid); +} +EXPORT_SYMBOL_GPL(iommu_free_global_pasid); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 15aa4a1f7b1a..07654969414c 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -724,6 +724,8 @@ void iommu_detach_device_pasid(struct iommu_domain *domain, struct iommu_domain * iommu_get_domain_for_dev_pasid(struct device *dev, ioasid_t pasid, unsigned int type); +ioasid_t iommu_alloc_global_pasid_dev(struct device *dev); +void iommu_free_global_pasid(ioasid_t pasid); #else /* CONFIG_IOMMU_API */ struct iommu_ops {}; @@ -1090,6 +1092,13 @@ iommu_get_domain_for_dev_pasid(struct device *dev, ioasid_t pasid, { return NULL; } + +static inline ioasid_t iommu_alloc_global_pasid_dev(struct device *dev) +{ + return IOMMU_PASID_INVALID; +} + +static inline void iommu_free_global_pasid(ioasid_t pasid) {} #endif /* CONFIG_IOMMU_API */ /** -- 2.25.1