The current in-kernel supervisor PASID support is based on the SVA
machinery in SVA lib. The binding between a kernel PASID and kernel
mapping has many flaws. Remove SVM_FLAG_SUPERVISOR_MODE support.

Link: https://lore.kernel.org/linux-iommu/20210511194726.gp1002...@nvidia.com/
Signed-off-by: Jacob Pan <jacob.jun....@linux.intel.com>
Signed-off-by: Lu Baolu <baolu...@linux.intel.com>
---
 drivers/iommu/intel/svm.c | 53 +++++++++------------------------------
 1 file changed, 12 insertions(+), 41 deletions(-)

diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c
index 23a38763c1d1..4c283a250541 100644
--- a/drivers/iommu/intel/svm.c
+++ b/drivers/iommu/intel/svm.c
@@ -313,8 +313,7 @@ static int pasid_to_svm_sdev(struct device *dev, unsigned 
int pasid,
        return 0;
 }
 
-static int intel_svm_alloc_pasid(struct device *dev, struct mm_struct *mm,
-                                unsigned int flags)
+static int intel_svm_alloc_pasid(struct device *dev, struct mm_struct *mm)
 {
        ioasid_t max_pasid = dev_is_pci(dev) ?
                        pci_max_pasids(to_pci_dev(dev)) : intel_pasid_max_id;
@@ -324,8 +323,7 @@ static int intel_svm_alloc_pasid(struct device *dev, struct 
mm_struct *mm,
 
 static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
                                           struct device *dev,
-                                          struct mm_struct *mm,
-                                          unsigned int flags)
+                                          struct mm_struct *mm)
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
        unsigned long iflags, sflags;
@@ -341,22 +339,18 @@ static struct iommu_sva *intel_svm_bind_mm(struct 
intel_iommu *iommu,
 
                svm->pasid = mm->pasid;
                svm->mm = mm;
-               svm->flags = flags;
                INIT_LIST_HEAD_RCU(&svm->devs);
 
-               if (!(flags & SVM_FLAG_SUPERVISOR_MODE)) {
-                       svm->notifier.ops = &intel_mmuops;
-                       ret = mmu_notifier_register(&svm->notifier, mm);
-                       if (ret) {
-                               kfree(svm);
-                               return ERR_PTR(ret);
-                       }
+               svm->notifier.ops = &intel_mmuops;
+               ret = mmu_notifier_register(&svm->notifier, mm);
+               if (ret) {
+                       kfree(svm);
+                       return ERR_PTR(ret);
                }
 
                ret = pasid_private_add(svm->pasid, svm);
                if (ret) {
-                       if (svm->notifier.ops)
-                               mmu_notifier_unregister(&svm->notifier, mm);
+                       mmu_notifier_unregister(&svm->notifier, mm);
                        kfree(svm);
                        return ERR_PTR(ret);
                }
@@ -391,9 +385,7 @@ static struct iommu_sva *intel_svm_bind_mm(struct 
intel_iommu *iommu,
        }
 
        /* Setup the pasid table: */
-       sflags = (flags & SVM_FLAG_SUPERVISOR_MODE) ?
-                       PASID_FLAG_SUPERVISOR_MODE : 0;
-       sflags |= cpu_feature_enabled(X86_FEATURE_LA57) ? PASID_FLAG_FL5LP : 0;
+       sflags = cpu_feature_enabled(X86_FEATURE_LA57) ? PASID_FLAG_FL5LP : 0;
        spin_lock_irqsave(&iommu->lock, iflags);
        ret = intel_pasid_setup_first_level(iommu, dev, mm->pgd, mm->pasid,
                                            FLPT_DEFAULT_DID, sflags);
@@ -410,8 +402,7 @@ static struct iommu_sva *intel_svm_bind_mm(struct 
intel_iommu *iommu,
        kfree(sdev);
 free_svm:
        if (list_empty(&svm->devs)) {
-               if (svm->notifier.ops)
-                       mmu_notifier_unregister(&svm->notifier, mm);
+               mmu_notifier_unregister(&svm->notifier, mm);
                pasid_private_remove(mm->pasid);
                kfree(svm);
        }
@@ -817,37 +808,17 @@ static irqreturn_t prq_event_thread(int irq, void *d)
 struct iommu_sva *intel_svm_bind(struct device *dev, struct mm_struct *mm, 
void *drvdata)
 {
        struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
-       unsigned int flags = 0;
        struct iommu_sva *sva;
        int ret;
 
-       if (drvdata)
-               flags = *(unsigned int *)drvdata;
-
-       if (flags & SVM_FLAG_SUPERVISOR_MODE) {
-               if (!ecap_srs(iommu->ecap)) {
-                       dev_err(dev, "%s: Supervisor PASID not supported\n",
-                               iommu->name);
-                       return ERR_PTR(-EOPNOTSUPP);
-               }
-
-               if (mm) {
-                       dev_err(dev, "%s: Supervisor PASID with user provided 
mm\n",
-                               iommu->name);
-                       return ERR_PTR(-EINVAL);
-               }
-
-               mm = &init_mm;
-       }
-
        mutex_lock(&pasid_mutex);
-       ret = intel_svm_alloc_pasid(dev, mm, flags);
+       ret = intel_svm_alloc_pasid(dev, mm);
        if (ret) {
                mutex_unlock(&pasid_mutex);
                return ERR_PTR(ret);
        }
 
-       sva = intel_svm_bind_mm(iommu, dev, mm, flags);
+       sva = intel_svm_bind_mm(iommu, dev, mm);
        mutex_unlock(&pasid_mutex);
 
        return sva;
-- 
2.25.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to