Merge tag 'pci-v4.13-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
[sfrench/cifs-2.6.git] / drivers / iommu / intel-svm.c
index 23c427602c55ba10a546737edabb1bfb24497304..f167c0d84ebfb7f5937eb798c9cdbd8bd9abe6c6 100644 (file)
@@ -489,6 +489,36 @@ int intel_svm_unbind_mm(struct device *dev, int pasid)
 }
 EXPORT_SYMBOL_GPL(intel_svm_unbind_mm);
 
+int intel_svm_is_pasid_valid(struct device *dev, int pasid)
+{
+       struct intel_iommu *iommu;
+       struct intel_svm *svm;
+       int ret = -EINVAL;
+
+       mutex_lock(&pasid_mutex);
+       iommu = intel_svm_device_to_iommu(dev);
+       if (!iommu || !iommu->pasid_table)
+               goto out;
+
+       svm = idr_find(&iommu->pasid_idr, pasid);
+       if (!svm)
+               goto out;
+
+       /* init_mm is used in this case */
+       if (!svm->mm)
+               ret = 1;
+       else if (atomic_read(&svm->mm->mm_users) > 0)
+               ret = 1;
+       else
+               ret = 0;
+
+ out:
+       mutex_unlock(&pasid_mutex);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(intel_svm_is_pasid_valid);
+
 /* Page request queue descriptor */
 struct page_req_dsc {
        u64 srr:1;