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>, Jason Gunthorpe <jgg@nvidia.com>, "Christoph Hellwig" <hch@infradead.org>, "Lu Baolu" <baolu.lu@linux.intel.com>, Jean-Philippe Brucker <jean-philippe@linaro.com> Cc: "Tian, Kevin" <kevin.tian@intel.com>, Tony Luck <tony.luck@intel.com>, Dave Jiang <dave.jiang@intel.com>, Raj Ashok <ashok.raj@intel.com>, "Zanussi, Tom" <tom.zanussi@intel.com>, "Kumar, Sanjay K" <sanjay.k.kumar@intel.com>, Jacob Pan <jacob.jun.pan@intel.com>, Dan Williams <dan.j.williams@intel.com> Subject: [PATCH v2 9/9] dmaengine: idxd: separate user and kernel pasid enabling Date: Mon, 14 Mar 2022 22:07:13 -0700 [thread overview] Message-ID: <20220315050713.2000518-10-jacob.jun.pan@linux.intel.com> (raw) In-Reply-To: <20220315050713.2000518-1-jacob.jun.pan@linux.intel.com> From: Dave Jiang <dave.jiang@intel.com> The idxd driver always gated the pasid enabling under a single knob and this assumption is incorrect. The pasid used for kernel operation can be independently toggled and has no dependency on the user pasid (and vice versa). Split the two so they are independent "enabled" flags. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> --- drivers/dma/idxd/cdev.c | 4 ++-- drivers/dma/idxd/idxd.h | 6 ++++++ drivers/dma/idxd/init.c | 30 ++++++++++++++++++------------ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 312ec37ebf91..addaebca7683 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -99,7 +99,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) ctx->wq = wq; filp->private_data = ctx; - if (device_pasid_enabled(idxd)) { + if (device_user_pasid_enabled(idxd)) { sva = iommu_sva_bind_device(dev, current->mm); if (IS_ERR(sva)) { rc = PTR_ERR(sva); @@ -152,7 +152,7 @@ static int idxd_cdev_release(struct inode *node, struct file *filep) if (wq_shared(wq)) { idxd_device_drain_pasid(idxd, ctx->pasid); } else { - if (device_pasid_enabled(idxd)) { + if (device_user_pasid_enabled(idxd)) { /* The wq disable in the disable pasid function will drain the wq */ rc = idxd_wq_disable_pasid(wq); if (rc < 0) diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h index a09ab4a6e1c1..190b08bd7c08 100644 --- a/drivers/dma/idxd/idxd.h +++ b/drivers/dma/idxd/idxd.h @@ -239,6 +239,7 @@ enum idxd_device_flag { IDXD_FLAG_CONFIGURABLE = 0, IDXD_FLAG_CMD_RUNNING, IDXD_FLAG_PASID_ENABLED, + IDXD_FLAG_USER_PASID_ENABLED, }; struct idxd_dma_dev { @@ -468,6 +469,11 @@ static inline bool device_pasid_enabled(struct idxd_device *idxd) return test_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); } +static inline bool device_user_pasid_enabled(struct idxd_device *idxd) +{ + return test_bit(IDXD_FLAG_USER_PASID_ENABLED, &idxd->flags); +} + static inline bool device_swq_supported(struct idxd_device *idxd) { return (support_enqcmd && device_pasid_enabled(idxd)); diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c index 5d1f8dd4abf6..981150b7d09b 100644 --- a/drivers/dma/idxd/init.c +++ b/drivers/dma/idxd/init.c @@ -500,16 +500,19 @@ static int idxd_probe(struct idxd_device *idxd) if (IS_ENABLED(CONFIG_INTEL_IDXD_SVM) && sva) { rc = iommu_dev_enable_feature(dev, IOMMU_DEV_FEAT_SVA); - if (rc == 0) { - rc = idxd_enable_system_pasid(idxd); - if (rc < 0) { - iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); - dev_warn(dev, "Failed to enable PASID. No SVA support: %d\n", rc); - } else { - set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); - } - } else { + if (rc) { + /* + * Do not bail here since legacy DMA is still + * supported, both user and in-kernel DMA with + * PASID rely on SVA feature. + */ dev_warn(dev, "Unable to turn on SVA feature.\n"); + } else { + set_bit(IDXD_FLAG_USER_PASID_ENABLED, &idxd->flags); + if (idxd_enable_system_pasid(idxd)) + dev_warn(dev, "No in-kernel DMA with PASID.\n"); + else + set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); } } idxd_read_caps(idxd); @@ -545,7 +548,8 @@ static int idxd_probe(struct idxd_device *idxd) err: if (device_pasid_enabled(idxd)) idxd_disable_system_pasid(idxd); - iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); + if (device_user_pasid_enabled(idxd) || device_pasid_enabled(idxd)) + iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); return rc; } @@ -558,7 +562,8 @@ static void idxd_cleanup(struct idxd_device *idxd) idxd_cleanup_internals(idxd); if (device_pasid_enabled(idxd)) idxd_disable_system_pasid(idxd); - iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); + if (device_user_pasid_enabled(idxd) || device_pasid_enabled(idxd)) + iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); } static int idxd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) @@ -677,7 +682,8 @@ static void idxd_remove(struct pci_dev *pdev) free_irq(irq_entry->vector, irq_entry); pci_free_irq_vectors(pdev); pci_iounmap(pdev, idxd->reg_base); - iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); + if (device_user_pasid_enabled(idxd) || device_pasid_enabled(idxd)) + iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); pci_disable_device(pdev); destroy_workqueue(idxd->wq); perfmon_pmu_remove(idxd); -- 2.25.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
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>, Jason Gunthorpe <jgg@nvidia.com>, "Christoph Hellwig" <hch@infradead.org>, "Lu Baolu" <baolu.lu@linux.intel.com>, Jean-Philippe Brucker <jean-philippe@linaro.com> Cc: Jacob Pan <jacob.jun.pan@intel.com>, Raj Ashok <ashok.raj@intel.com>, "Kumar, Sanjay K" <sanjay.k.kumar@intel.com>, Dave Jiang <dave.jiang@intel.com>, Tony Luck <tony.luck@intel.com>, "Zanussi, Tom" <tom.zanussi@intel.com>, Dan Williams <dan.j.williams@intel.com>, "Tian, Kevin" <kevin.tian@intel.com>, Yi Liu <yi.l.liu@intel.com> Subject: [PATCH v2 9/9] dmaengine: idxd: separate user and kernel pasid enabling Date: Mon, 14 Mar 2022 22:07:13 -0700 [thread overview] Message-ID: <20220315050713.2000518-10-jacob.jun.pan@linux.intel.com> (raw) In-Reply-To: <20220315050713.2000518-1-jacob.jun.pan@linux.intel.com> From: Dave Jiang <dave.jiang@intel.com> The idxd driver always gated the pasid enabling under a single knob and this assumption is incorrect. The pasid used for kernel operation can be independently toggled and has no dependency on the user pasid (and vice versa). Split the two so they are independent "enabled" flags. Signed-off-by: Dave Jiang <dave.jiang@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> --- drivers/dma/idxd/cdev.c | 4 ++-- drivers/dma/idxd/idxd.h | 6 ++++++ drivers/dma/idxd/init.c | 30 ++++++++++++++++++------------ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c index 312ec37ebf91..addaebca7683 100644 --- a/drivers/dma/idxd/cdev.c +++ b/drivers/dma/idxd/cdev.c @@ -99,7 +99,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp) ctx->wq = wq; filp->private_data = ctx; - if (device_pasid_enabled(idxd)) { + if (device_user_pasid_enabled(idxd)) { sva = iommu_sva_bind_device(dev, current->mm); if (IS_ERR(sva)) { rc = PTR_ERR(sva); @@ -152,7 +152,7 @@ static int idxd_cdev_release(struct inode *node, struct file *filep) if (wq_shared(wq)) { idxd_device_drain_pasid(idxd, ctx->pasid); } else { - if (device_pasid_enabled(idxd)) { + if (device_user_pasid_enabled(idxd)) { /* The wq disable in the disable pasid function will drain the wq */ rc = idxd_wq_disable_pasid(wq); if (rc < 0) diff --git a/drivers/dma/idxd/idxd.h b/drivers/dma/idxd/idxd.h index a09ab4a6e1c1..190b08bd7c08 100644 --- a/drivers/dma/idxd/idxd.h +++ b/drivers/dma/idxd/idxd.h @@ -239,6 +239,7 @@ enum idxd_device_flag { IDXD_FLAG_CONFIGURABLE = 0, IDXD_FLAG_CMD_RUNNING, IDXD_FLAG_PASID_ENABLED, + IDXD_FLAG_USER_PASID_ENABLED, }; struct idxd_dma_dev { @@ -468,6 +469,11 @@ static inline bool device_pasid_enabled(struct idxd_device *idxd) return test_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); } +static inline bool device_user_pasid_enabled(struct idxd_device *idxd) +{ + return test_bit(IDXD_FLAG_USER_PASID_ENABLED, &idxd->flags); +} + static inline bool device_swq_supported(struct idxd_device *idxd) { return (support_enqcmd && device_pasid_enabled(idxd)); diff --git a/drivers/dma/idxd/init.c b/drivers/dma/idxd/init.c index 5d1f8dd4abf6..981150b7d09b 100644 --- a/drivers/dma/idxd/init.c +++ b/drivers/dma/idxd/init.c @@ -500,16 +500,19 @@ static int idxd_probe(struct idxd_device *idxd) if (IS_ENABLED(CONFIG_INTEL_IDXD_SVM) && sva) { rc = iommu_dev_enable_feature(dev, IOMMU_DEV_FEAT_SVA); - if (rc == 0) { - rc = idxd_enable_system_pasid(idxd); - if (rc < 0) { - iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); - dev_warn(dev, "Failed to enable PASID. No SVA support: %d\n", rc); - } else { - set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); - } - } else { + if (rc) { + /* + * Do not bail here since legacy DMA is still + * supported, both user and in-kernel DMA with + * PASID rely on SVA feature. + */ dev_warn(dev, "Unable to turn on SVA feature.\n"); + } else { + set_bit(IDXD_FLAG_USER_PASID_ENABLED, &idxd->flags); + if (idxd_enable_system_pasid(idxd)) + dev_warn(dev, "No in-kernel DMA with PASID.\n"); + else + set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags); } } idxd_read_caps(idxd); @@ -545,7 +548,8 @@ static int idxd_probe(struct idxd_device *idxd) err: if (device_pasid_enabled(idxd)) idxd_disable_system_pasid(idxd); - iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); + if (device_user_pasid_enabled(idxd) || device_pasid_enabled(idxd)) + iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); return rc; } @@ -558,7 +562,8 @@ static void idxd_cleanup(struct idxd_device *idxd) idxd_cleanup_internals(idxd); if (device_pasid_enabled(idxd)) idxd_disable_system_pasid(idxd); - iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); + if (device_user_pasid_enabled(idxd) || device_pasid_enabled(idxd)) + iommu_dev_disable_feature(dev, IOMMU_DEV_FEAT_SVA); } static int idxd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) @@ -677,7 +682,8 @@ static void idxd_remove(struct pci_dev *pdev) free_irq(irq_entry->vector, irq_entry); pci_free_irq_vectors(pdev); pci_iounmap(pdev, idxd->reg_base); - iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); + if (device_user_pasid_enabled(idxd) || device_pasid_enabled(idxd)) + iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); pci_disable_device(pdev); destroy_workqueue(idxd->wq); perfmon_pmu_remove(idxd); -- 2.25.1
next prev parent reply other threads:[~2022-03-15 5:04 UTC|newest] Thread overview: 122+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-03-15 5:07 [PATCH v2 0/8] Enable PASID for DMA API users Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 1/8] iommu: Assign per device max PASID Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 2/8] iommu: Add attach/detach_dev_pasid domain ops Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-15 10:24 ` Tian, Kevin 2022-03-15 10:24 ` Tian, Kevin 2022-03-15 11:26 ` Jean-Philippe Brucker 2022-03-15 11:26 ` Jean-Philippe Brucker 2022-03-15 11:49 ` Tian, Kevin 2022-03-15 11:49 ` Tian, Kevin 2022-03-15 16:11 ` Jacob Pan 2022-03-15 16:11 ` Jacob Pan 2022-03-18 12:01 ` Lu Baolu 2022-03-18 12:01 ` Lu Baolu 2022-03-18 13:50 ` Jason Gunthorpe 2022-03-18 13:50 ` Jason Gunthorpe via iommu 2022-03-18 11:52 ` Lu Baolu 2022-03-18 11:52 ` Lu Baolu 2022-03-18 13:48 ` Jason Gunthorpe 2022-03-18 13:48 ` Jason Gunthorpe via iommu 2022-03-15 5:07 ` [PATCH v2 3/8] iommu/vt-d: Implement device_pasid domain attach ops Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-15 10:33 ` Tian, Kevin 2022-03-15 10:33 ` Tian, Kevin 2022-03-15 22:23 ` Jacob Pan 2022-03-15 22:23 ` Jacob Pan 2022-03-15 14:33 ` Jason Gunthorpe 2022-03-15 14:33 ` Jason Gunthorpe via iommu 2022-03-15 22:36 ` Jacob Pan 2022-03-15 22:36 ` Jacob Pan 2022-03-15 23:04 ` Jason Gunthorpe 2022-03-15 23:04 ` Jason Gunthorpe via iommu 2022-03-16 20:50 ` Jacob Pan 2022-03-16 20:50 ` Jacob Pan 2022-03-16 22:15 ` Jason Gunthorpe 2022-03-16 22:15 ` Jason Gunthorpe via iommu 2022-03-16 22:23 ` Luck, Tony 2022-03-16 22:23 ` Luck, Tony 2022-03-17 0:04 ` Jason Gunthorpe 2022-03-17 0:04 ` Jason Gunthorpe via iommu 2022-03-18 5:47 ` Tian, Kevin 2022-03-18 5:47 ` Tian, Kevin 2022-03-18 13:47 ` Jason Gunthorpe 2022-03-18 13:47 ` Jason Gunthorpe via iommu 2022-03-17 0:49 ` Jacob Pan 2022-03-17 0:49 ` Jacob Pan 2022-03-17 13:23 ` Jason Gunthorpe 2022-03-17 13:23 ` Jason Gunthorpe via iommu 2022-03-17 18:23 ` Jacob Pan 2022-03-17 18:23 ` Jacob Pan 2022-03-16 7:41 ` Tian, Kevin 2022-03-16 7:41 ` Tian, Kevin 2022-03-16 21:01 ` Jacob Pan 2022-03-16 21:01 ` Jacob Pan 2022-03-18 5:33 ` Tian, Kevin 2022-03-18 5:33 ` Tian, Kevin 2022-03-28 21:41 ` Jacob Pan 2022-03-28 21:41 ` Jacob Pan 2022-03-16 7:39 ` Tian, Kevin 2022-03-16 7:39 ` Tian, Kevin 2022-03-16 20:51 ` Jacob Pan 2022-03-16 20:51 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 4/8] iommu/vt-d: Use device_pasid attach op for RID2PASID Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-16 7:54 ` Tian, Kevin 2022-03-16 7:54 ` Tian, Kevin 2022-03-17 20:45 ` Jacob Pan 2022-03-17 20:45 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 5/8] iommu: Add PASID support for DMA mapping API users Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-15 11:16 ` Robin Murphy 2022-03-15 11:16 ` Robin Murphy 2022-03-15 14:22 ` Jason Gunthorpe 2022-03-15 14:22 ` Jason Gunthorpe via iommu 2022-03-15 16:31 ` Jacob Pan 2022-03-15 16:31 ` Jacob Pan 2022-03-15 17:05 ` Jason Gunthorpe 2022-03-15 17:05 ` Jason Gunthorpe via iommu 2022-03-15 21:24 ` Jacob Pan 2022-03-15 21:24 ` Jacob Pan 2022-03-16 10:32 ` Tian, Kevin 2022-03-16 10:32 ` Tian, Kevin 2022-03-16 8:41 ` Tian, Kevin 2022-03-16 8:41 ` Tian, Kevin 2022-03-16 14:07 ` Jason Gunthorpe 2022-03-16 14:07 ` Jason Gunthorpe via iommu 2022-03-15 14:35 ` Jason Gunthorpe 2022-03-15 14:35 ` Jason Gunthorpe via iommu 2022-03-15 16:38 ` Jacob Pan 2022-03-15 16:38 ` Jacob Pan 2022-03-15 23:05 ` Jason Gunthorpe 2022-03-15 23:05 ` Jason Gunthorpe via iommu 2022-03-18 12:43 ` Lu Baolu 2022-03-18 12:43 ` Lu Baolu 2022-03-28 21:44 ` Jacob Pan 2022-03-28 21:44 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 6/8] dmaengine: idxd: Use DMA API for in-kernel DMA with PASID Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-18 6:10 ` Tian, Kevin 2022-03-18 6:10 ` Tian, Kevin 2022-03-29 17:39 ` Jacob Pan 2022-03-29 17:39 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 7/8] iommu/vt-d: Delete supervisor/kernel SVA Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-18 6:16 ` Tian, Kevin 2022-03-18 6:16 ` Tian, Kevin 2022-03-29 17:42 ` Jacob Pan 2022-03-29 17:42 ` Jacob Pan 2022-03-15 5:07 ` [PATCH v2 8/8] iommu: Remove unused driver data in sva_bind_device Jacob Pan 2022-03-15 5:07 ` Jacob Pan 2022-03-15 11:37 ` Jean-Philippe Brucker 2022-03-15 11:37 ` Jean-Philippe Brucker 2022-03-15 5:07 ` Jacob Pan [this message] 2022-03-15 5:07 ` [PATCH v2 9/9] dmaengine: idxd: separate user and kernel pasid enabling Jacob Pan 2022-03-18 6:28 ` Tian, Kevin 2022-03-18 6:28 ` Tian, Kevin 2022-03-15 8:16 ` [PATCH v2 0/8] Enable PASID for DMA API users Tian, Kevin 2022-03-15 8:16 ` Tian, Kevin 2022-03-15 15:49 ` Jacob Pan 2022-03-15 15:49 ` 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=20220315050713.2000518-10-jacob.jun.pan@linux.intel.com \ --to=jacob.jun.pan@linux.intel.com \ --cc=ashok.raj@intel.com \ --cc=baolu.lu@linux.intel.com \ --cc=dan.j.williams@intel.com \ --cc=dave.jiang@intel.com \ --cc=hch@infradead.org \ --cc=iommu@lists.linux-foundation.org \ --cc=jacob.jun.pan@intel.com \ --cc=jean-philippe@linaro.com \ --cc=jgg@nvidia.com \ --cc=joro@8bytes.org \ --cc=kevin.tian@intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=sanjay.k.kumar@intel.com \ --cc=tom.zanussi@intel.com \ --cc=tony.luck@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.