From: Jacob Pan <jacob.jun.pan@linux.intel.com> To: iommu@lists.linux-foundation.org, LKML <linux-kernel@vger.kernel.org>, Joerg Roedel <joro@8bytes.org>, David Woodhouse <dwmw2@infradead.org>, Alex Williamson <alex.williamson@redhat.com>, Jean-Philippe Brucker <jean-philippe@linaro.com> Cc: "Yi Liu" <yi.l.liu@intel.com>, "Tian, Kevin" <kevin.tian@intel.com>, Raj Ashok <ashok.raj@intel.com>, "Christoph Hellwig" <hch@infradead.org>, "Lu Baolu" <baolu.lu@linux.intel.com>, Jonathan Cameron <jic23@kernel.org>, Eric Auger <eric.auger@redhat.com>, Jacob Pan <jacob.jun.pan@linux.intel.com> Subject: [PATCH v7 03/11] iommu/vt-d: Add custom allocator for IOASID Date: Thu, 24 Oct 2019 12:54:56 -0700 [thread overview] Message-ID: <1571946904-86776-4-git-send-email-jacob.jun.pan@linux.intel.com> (raw) In-Reply-To: <1571946904-86776-1-git-send-email-jacob.jun.pan@linux.intel.com> When VT-d driver runs in the guest, PASID allocation must be performed via virtual command interface. This patch registers a custom IOASID allocator which takes precedence over the default XArray based allocator. The resulting IOASID allocation will always come from the host. This ensures that PASID namespace is system- wide. Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Liu, Yi L <yi.l.liu@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> --- drivers/iommu/Kconfig | 1 + drivers/iommu/intel-iommu.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/intel-iommu.h | 2 ++ 3 files changed, 70 insertions(+) diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index fd50ddffffbf..961fe5795a90 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -211,6 +211,7 @@ config INTEL_IOMMU_SVM bool "Support for Shared Virtual Memory with Intel IOMMU" depends on INTEL_IOMMU && X86 select PCI_PASID + select IOASID select MMU_NOTIFIER help Shared Virtual Memory (SVM) provides a facility for devices diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 3f974919d3bd..ced1d89ef977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -1706,6 +1706,9 @@ static void free_dmar_iommu(struct intel_iommu *iommu) if (ecap_prs(iommu->ecap)) intel_svm_finish_prq(iommu); } + if (ecap_vcs(iommu->ecap) && vccap_pasid(iommu->vccap)) + ioasid_unregister_allocator(&iommu->pasid_allocator); + #endif } @@ -4910,6 +4913,44 @@ static int __init probe_acpi_namespace_devices(void) return 0; } +#ifdef CONFIG_INTEL_IOMMU_SVM +static ioasid_t intel_ioasid_alloc(ioasid_t min, ioasid_t max, void *data) +{ + struct intel_iommu *iommu = data; + ioasid_t ioasid; + + /* + * VT-d virtual command interface always uses the full 20 bit + * PASID range. Host can partition guest PASID range based on + * policies but it is out of guest's control. + */ + if (min < PASID_MIN || max > intel_pasid_max_id) + return INVALID_IOASID; + + if (vcmd_alloc_pasid(iommu, &ioasid)) + return INVALID_IOASID; + + return ioasid; +} + +static void intel_ioasid_free(ioasid_t ioasid, void *data) +{ + struct intel_iommu *iommu = data; + + if (!iommu) + return; + /* + * Sanity check the ioasid owner is done at upper layer, e.g. VFIO + * We can only free the PASID when all the devices are unbond. + */ + if (ioasid_find(NULL, ioasid, NULL)) { + pr_alert("Cannot free active IOASID %d\n", ioasid); + return; + } + vcmd_free_pasid(iommu, ioasid); +} +#endif + int __init intel_iommu_init(void) { int ret = -ENODEV; @@ -5020,6 +5061,32 @@ int __init intel_iommu_init(void) "%s", iommu->name); iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops); iommu_device_register(&iommu->iommu); +#ifdef CONFIG_INTEL_IOMMU_SVM + if (ecap_vcs(iommu->ecap) && vccap_pasid(iommu->vccap)) { + pr_info("Register custom PASID allocator\n"); + /* + * Register a custom ASID allocator if we are running + * in a guest, the purpose is to have a system wide PASID + * namespace among all PASID users. + * There can be multiple vIOMMUs in each guest but only + * one allocator is active. All vIOMMU allocators will + * eventually be calling the same host allocator. + */ + iommu->pasid_allocator.alloc = intel_ioasid_alloc; + iommu->pasid_allocator.free = intel_ioasid_free; + iommu->pasid_allocator.pdata = (void *)iommu; + ret = ioasid_register_allocator(&iommu->pasid_allocator); + if (ret) { + pr_warn("Custom PASID allocator registeration failed\n"); + /* + * Disable scalable mode on this IOMMU if there + * is no custom allocator. Mixing SM capable vIOMMU + * and non-SM vIOMMU are not supported. + */ + intel_iommu_sm = 0; + } + } +#endif } bus_set_iommu(&pci_bus_type, &intel_iommu_ops); diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 1d4b8dcdc5d8..c624733cb2e6 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -19,6 +19,7 @@ #include <linux/iommu.h> #include <linux/io-64-nonatomic-lo-hi.h> #include <linux/dmar.h> +#include <linux/ioasid.h> #include <asm/cacheflush.h> #include <asm/iommu.h> @@ -546,6 +547,7 @@ struct intel_iommu { #ifdef CONFIG_INTEL_IOMMU_SVM struct page_req_dsc *prq; unsigned char prq_name[16]; /* Name for PRQ interrupt */ + struct ioasid_allocator_ops pasid_allocator; /* Custom allocator for PASIDs */ #endif struct q_inval *qi; /* Queued invalidation info */ u32 *iommu_state; /* Store iommu states between suspend and resume.*/ -- 2.7.4
WARNING: multiple messages have this Message-ID (diff)
From: Jacob Pan <jacob.jun.pan@linux.intel.com> To: iommu@lists.linux-foundation.org, LKML <linux-kernel@vger.kernel.org>, Joerg Roedel <joro@8bytes.org>, David Woodhouse <dwmw2@infradead.org>, Alex Williamson <alex.williamson@redhat.com>, Jean-Philippe Brucker <jean-philippe@linaro.com> Cc: "Tian, Kevin" <kevin.tian@intel.com>, Raj Ashok <ashok.raj@intel.com>, Jonathan Cameron <jic23@kernel.org> Subject: [PATCH v7 03/11] iommu/vt-d: Add custom allocator for IOASID Date: Thu, 24 Oct 2019 12:54:56 -0700 [thread overview] Message-ID: <1571946904-86776-4-git-send-email-jacob.jun.pan@linux.intel.com> (raw) In-Reply-To: <1571946904-86776-1-git-send-email-jacob.jun.pan@linux.intel.com> When VT-d driver runs in the guest, PASID allocation must be performed via virtual command interface. This patch registers a custom IOASID allocator which takes precedence over the default XArray based allocator. The resulting IOASID allocation will always come from the host. This ensures that PASID namespace is system- wide. Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Liu, Yi L <yi.l.liu@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> --- drivers/iommu/Kconfig | 1 + drivers/iommu/intel-iommu.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/intel-iommu.h | 2 ++ 3 files changed, 70 insertions(+) diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index fd50ddffffbf..961fe5795a90 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -211,6 +211,7 @@ config INTEL_IOMMU_SVM bool "Support for Shared Virtual Memory with Intel IOMMU" depends on INTEL_IOMMU && X86 select PCI_PASID + select IOASID select MMU_NOTIFIER help Shared Virtual Memory (SVM) provides a facility for devices diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 3f974919d3bd..ced1d89ef977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -1706,6 +1706,9 @@ static void free_dmar_iommu(struct intel_iommu *iommu) if (ecap_prs(iommu->ecap)) intel_svm_finish_prq(iommu); } + if (ecap_vcs(iommu->ecap) && vccap_pasid(iommu->vccap)) + ioasid_unregister_allocator(&iommu->pasid_allocator); + #endif } @@ -4910,6 +4913,44 @@ static int __init probe_acpi_namespace_devices(void) return 0; } +#ifdef CONFIG_INTEL_IOMMU_SVM +static ioasid_t intel_ioasid_alloc(ioasid_t min, ioasid_t max, void *data) +{ + struct intel_iommu *iommu = data; + ioasid_t ioasid; + + /* + * VT-d virtual command interface always uses the full 20 bit + * PASID range. Host can partition guest PASID range based on + * policies but it is out of guest's control. + */ + if (min < PASID_MIN || max > intel_pasid_max_id) + return INVALID_IOASID; + + if (vcmd_alloc_pasid(iommu, &ioasid)) + return INVALID_IOASID; + + return ioasid; +} + +static void intel_ioasid_free(ioasid_t ioasid, void *data) +{ + struct intel_iommu *iommu = data; + + if (!iommu) + return; + /* + * Sanity check the ioasid owner is done at upper layer, e.g. VFIO + * We can only free the PASID when all the devices are unbond. + */ + if (ioasid_find(NULL, ioasid, NULL)) { + pr_alert("Cannot free active IOASID %d\n", ioasid); + return; + } + vcmd_free_pasid(iommu, ioasid); +} +#endif + int __init intel_iommu_init(void) { int ret = -ENODEV; @@ -5020,6 +5061,32 @@ int __init intel_iommu_init(void) "%s", iommu->name); iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops); iommu_device_register(&iommu->iommu); +#ifdef CONFIG_INTEL_IOMMU_SVM + if (ecap_vcs(iommu->ecap) && vccap_pasid(iommu->vccap)) { + pr_info("Register custom PASID allocator\n"); + /* + * Register a custom ASID allocator if we are running + * in a guest, the purpose is to have a system wide PASID + * namespace among all PASID users. + * There can be multiple vIOMMUs in each guest but only + * one allocator is active. All vIOMMU allocators will + * eventually be calling the same host allocator. + */ + iommu->pasid_allocator.alloc = intel_ioasid_alloc; + iommu->pasid_allocator.free = intel_ioasid_free; + iommu->pasid_allocator.pdata = (void *)iommu; + ret = ioasid_register_allocator(&iommu->pasid_allocator); + if (ret) { + pr_warn("Custom PASID allocator registeration failed\n"); + /* + * Disable scalable mode on this IOMMU if there + * is no custom allocator. Mixing SM capable vIOMMU + * and non-SM vIOMMU are not supported. + */ + intel_iommu_sm = 0; + } + } +#endif } bus_set_iommu(&pci_bus_type, &intel_iommu_ops); diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h index 1d4b8dcdc5d8..c624733cb2e6 100644 --- a/include/linux/intel-iommu.h +++ b/include/linux/intel-iommu.h @@ -19,6 +19,7 @@ #include <linux/iommu.h> #include <linux/io-64-nonatomic-lo-hi.h> #include <linux/dmar.h> +#include <linux/ioasid.h> #include <asm/cacheflush.h> #include <asm/iommu.h> @@ -546,6 +547,7 @@ struct intel_iommu { #ifdef CONFIG_INTEL_IOMMU_SVM struct page_req_dsc *prq; unsigned char prq_name[16]; /* Name for PRQ interrupt */ + struct ioasid_allocator_ops pasid_allocator; /* Custom allocator for PASIDs */ #endif struct q_inval *qi; /* Queued invalidation info */ u32 *iommu_state; /* Store iommu states between suspend and resume.*/ -- 2.7.4 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2019-10-24 19:51 UTC|newest] Thread overview: 158+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-10-24 19:54 [PATCH v7 00/11] Nested Shared Virtual Address (SVA) VT-d support Jacob Pan 2019-10-24 19:54 ` Jacob Pan 2019-10-24 19:54 ` [PATCH v7 01/11] iommu/vt-d: Cache virtual command capability register Jacob Pan 2019-10-24 19:54 ` Jacob Pan 2019-10-25 2:53 ` Lu Baolu 2019-10-25 2:53 ` Lu Baolu 2019-10-25 6:06 ` Tian, Kevin 2019-10-25 6:06 ` Tian, Kevin 2019-11-08 10:32 ` Auger Eric 2019-11-08 10:32 ` Auger Eric 2019-10-24 19:54 ` [PATCH v7 02/11] iommu/vt-d: Enlightened PASID allocation Jacob Pan 2019-10-24 19:54 ` Jacob Pan 2019-10-25 6:19 ` Tian, Kevin 2019-10-25 6:19 ` Tian, Kevin 2019-10-29 17:14 ` Jacob Pan 2019-10-29 17:14 ` Jacob Pan 2019-10-29 18:16 ` Tian, Kevin 2019-10-29 18:16 ` Tian, Kevin 2019-11-08 10:33 ` Auger Eric 2019-11-08 10:33 ` Auger Eric 2019-11-08 22:22 ` Jacob Pan 2019-11-08 22:22 ` Jacob Pan 2019-10-24 19:54 ` Jacob Pan [this message] 2019-10-24 19:54 ` [PATCH v7 03/11] iommu/vt-d: Add custom allocator for IOASID Jacob Pan 2019-10-25 2:30 ` Lu Baolu 2019-10-25 2:30 ` Lu Baolu 2019-10-25 4:43 ` Jacob Pan 2019-10-25 4:43 ` Jacob Pan 2019-10-25 6:40 ` Tian, Kevin 2019-10-25 6:40 ` Tian, Kevin 2019-10-25 14:39 ` Lu Baolu 2019-10-25 14:39 ` Lu Baolu 2019-10-25 15:52 ` Tian, Kevin 2019-10-25 15:52 ` Tian, Kevin 2019-10-28 22:49 ` Jacob Pan 2019-10-28 22:49 ` Jacob Pan 2019-10-29 2:22 ` Lu Baolu 2019-10-29 2:22 ` Lu Baolu 2019-10-25 6:31 ` Tian, Kevin 2019-10-25 6:31 ` Tian, Kevin 2019-10-28 22:52 ` Jacob Pan 2019-10-28 22:52 ` Jacob Pan 2019-11-08 10:40 ` Auger Eric 2019-11-08 10:40 ` Auger Eric 2019-11-08 22:26 ` Jacob Pan 2019-11-08 22:26 ` Jacob Pan 2019-10-24 19:54 ` [PATCH v7 04/11] iommu/vt-d: Replace Intel specific PASID allocator with IOASID Jacob Pan 2019-10-24 19:54 ` Jacob Pan 2019-10-25 5:47 ` Lu Baolu 2019-10-25 5:47 ` Lu Baolu 2019-11-01 18:29 ` Jacob Pan 2019-11-01 18:29 ` Jacob Pan 2019-10-25 6:41 ` Tian, Kevin 2019-10-25 6:41 ` Tian, Kevin 2019-10-28 22:46 ` Jacob Pan 2019-10-28 22:46 ` Jacob Pan 2019-11-08 11:30 ` Auger Eric 2019-11-08 11:30 ` Auger Eric 2019-11-08 22:55 ` Jacob Pan 2019-11-08 22:55 ` Jacob Pan 2019-11-12 9:54 ` Auger Eric 2019-11-12 9:54 ` Auger Eric 2019-10-24 19:54 ` [PATCH v7 05/11] iommu/vt-d: Move domain helper to header Jacob Pan 2019-10-24 19:54 ` Jacob Pan 2019-10-25 5:26 ` Lu Baolu 2019-10-25 5:26 ` Lu Baolu 2019-10-24 19:54 ` [PATCH v7 06/11] iommu/vt-d: Avoid duplicated code for PASID setup Jacob Pan 2019-10-24 19:54 ` Jacob Pan 2019-10-25 5:32 ` Lu Baolu 2019-10-25 5:32 ` Lu Baolu 2019-10-25 6:42 ` Tian, Kevin 2019-10-25 6:42 ` Tian, Kevin 2019-10-28 22:41 ` Jacob Pan 2019-10-28 22:41 ` Jacob Pan 2019-11-12 9:54 ` Auger Eric 2019-11-12 9:54 ` Auger Eric 2019-10-24 19:55 ` [PATCH v7 07/11] iommu/vt-d: Add nested translation helper function Jacob Pan 2019-10-24 19:55 ` Jacob Pan 2019-10-25 7:04 ` Tian, Kevin 2019-10-25 7:04 ` Tian, Kevin 2019-11-01 21:10 ` Jacob Pan 2019-11-01 21:10 ` Jacob Pan 2019-10-25 15:04 ` Lu Baolu 2019-10-25 15:04 ` Lu Baolu 2019-10-25 16:06 ` Jacob Pan 2019-10-25 16:06 ` Jacob Pan 2019-11-08 13:55 ` Auger Eric 2019-11-08 13:55 ` Auger Eric 2019-10-24 19:55 ` [PATCH v7 08/11] iommu/vt-d: Misc macro clean up for SVM Jacob Pan 2019-10-24 19:55 ` Jacob Pan 2019-10-26 1:00 ` Lu Baolu 2019-10-26 1:00 ` Lu Baolu 2019-10-28 22:38 ` Jacob Pan 2019-10-28 22:38 ` Jacob Pan 2019-10-24 19:55 ` [PATCH v7 09/11] iommu/vt-d: Add bind guest PASID support Jacob Pan 2019-10-24 19:55 ` Jacob Pan 2019-10-25 7:19 ` Tian, Kevin 2019-10-25 7:19 ` Tian, Kevin 2019-10-25 17:33 ` Jacob Pan 2019-10-25 17:33 ` Jacob Pan 2019-10-28 6:03 ` Tian, Kevin 2019-10-28 6:03 ` Tian, Kevin 2019-10-28 16:02 ` Jacob Pan 2019-10-28 16:02 ` Jacob Pan 2019-10-29 7:57 ` Tian, Kevin 2019-10-29 7:57 ` Tian, Kevin 2019-10-29 16:11 ` Jacob Pan 2019-10-29 16:11 ` Jacob Pan 2019-10-29 18:04 ` Tian, Kevin 2019-10-29 18:04 ` Tian, Kevin 2019-10-29 2:33 ` Lu Baolu 2019-10-29 2:33 ` Lu Baolu 2019-10-26 2:01 ` Lu Baolu 2019-10-26 2:01 ` Lu Baolu 2019-10-28 22:29 ` Jacob Pan 2019-10-28 22:29 ` Jacob Pan 2019-10-29 2:54 ` Lu Baolu 2019-10-29 2:54 ` Lu Baolu 2019-10-29 4:11 ` Jacob Pan 2019-10-29 4:11 ` Jacob Pan 2019-10-29 5:04 ` Lu Baolu 2019-10-29 5:04 ` Lu Baolu 2019-10-24 19:55 ` [PATCH v7 10/11] iommu/vt-d: Support flushing more translation cache types Jacob Pan 2019-10-24 19:55 ` Jacob Pan 2019-10-25 7:21 ` Tian, Kevin 2019-10-25 7:21 ` Tian, Kevin 2019-11-01 21:30 ` Jacob Pan 2019-11-01 21:30 ` Jacob Pan 2019-10-26 2:22 ` Lu Baolu 2019-10-26 2:22 ` Lu Baolu 2019-11-01 21:28 ` Jacob Pan 2019-11-01 21:28 ` Jacob Pan 2019-11-08 16:18 ` Auger Eric 2019-11-08 16:18 ` Auger Eric 2019-11-08 23:05 ` Jacob Pan 2019-11-08 23:05 ` Jacob Pan 2019-10-24 19:55 ` [PATCH v7 11/11] iommu/vt-d: Add svm/sva invalidate function Jacob Pan 2019-10-24 19:55 ` Jacob Pan 2019-10-25 7:27 ` Tian, Kevin 2019-10-25 7:27 ` Tian, Kevin 2019-10-26 2:40 ` Lu Baolu 2019-10-26 2:40 ` Lu Baolu 2019-10-26 7:03 ` Lu Baolu 2019-10-26 7:03 ` Lu Baolu 2019-10-28 6:06 ` Tian, Kevin 2019-10-28 6:06 ` Tian, Kevin 2019-10-28 16:10 ` Jacob Pan 2019-10-28 16:10 ` Jacob Pan 2019-10-29 18:52 ` Tian, Kevin 2019-10-29 18:52 ` Tian, Kevin 2019-10-29 19:25 ` Jacob Pan 2019-10-29 19:25 ` Jacob Pan 2019-10-28 16:13 ` Jacob Pan 2019-10-28 16:13 ` Jacob Pan 2019-11-12 10:28 ` Auger Eric 2019-11-12 10:28 ` Auger Eric 2020-02-15 1:18 ` Jacob Pan 2020-02-15 1:18 ` Jacob Pan
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1571946904-86776-4-git-send-email-jacob.jun.pan@linux.intel.com \ --to=jacob.jun.pan@linux.intel.com \ --cc=alex.williamson@redhat.com \ --cc=ashok.raj@intel.com \ --cc=baolu.lu@linux.intel.com \ --cc=dwmw2@infradead.org \ --cc=eric.auger@redhat.com \ --cc=hch@infradead.org \ --cc=iommu@lists.linux-foundation.org \ --cc=jean-philippe@linaro.com \ --cc=jic23@kernel.org \ --cc=joro@8bytes.org \ --cc=kevin.tian@intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=yi.l.liu@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.