Commit 49cab9d2 authored by Lu Baolu's avatar Lu Baolu Committed by Joerg Roedel

iommu/vt-d: Remove users from intel_svm_dev

It was used as a reference counter of an existing bond between device
and user application memory address. Commit be51b1d6 ("iommu/sva:
Refactoring iommu_sva_bind/unbind_device()") has added this in iommu
core. Remove it to avoid duplicate code.
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20230109014955.147068-4-baolu.lu@linux.intel.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 557abbd6
...@@ -762,7 +762,6 @@ struct intel_svm_dev { ...@@ -762,7 +762,6 @@ struct intel_svm_dev {
struct device *dev; struct device *dev;
struct intel_iommu *iommu; struct intel_iommu *iommu;
struct iommu_sva sva; struct iommu_sva sva;
int users;
u16 did; u16 did;
u16 sid, qdep; u16 sid, qdep;
}; };
......
...@@ -333,13 +333,6 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu, ...@@ -333,13 +333,6 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
} }
} }
/* Find the matching device in svm list */
sdev = svm_lookup_device_by_dev(svm, dev);
if (sdev) {
sdev->users++;
goto success;
}
sdev = kzalloc(sizeof(*sdev), GFP_KERNEL); sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
if (!sdev) { if (!sdev) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -350,7 +343,6 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu, ...@@ -350,7 +343,6 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
sdev->iommu = iommu; sdev->iommu = iommu;
sdev->did = FLPT_DEFAULT_DID; sdev->did = FLPT_DEFAULT_DID;
sdev->sid = PCI_DEVID(info->bus, info->devfn); sdev->sid = PCI_DEVID(info->bus, info->devfn);
sdev->users = 1;
sdev->sva.dev = dev; sdev->sva.dev = dev;
init_rcu_head(&sdev->rcu); init_rcu_head(&sdev->rcu);
if (info->ats_enabled) { if (info->ats_enabled) {
...@@ -367,7 +359,7 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu, ...@@ -367,7 +359,7 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
goto free_sdev; goto free_sdev;
list_add_rcu(&sdev->list, &svm->devs); list_add_rcu(&sdev->list, &svm->devs);
success:
return &sdev->sva; return &sdev->sva;
free_sdev: free_sdev:
...@@ -401,32 +393,32 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid) ...@@ -401,32 +393,32 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid)
mm = svm->mm; mm = svm->mm;
if (sdev) { if (sdev) {
sdev->users--; list_del_rcu(&sdev->list);
if (!sdev->users) { /*
list_del_rcu(&sdev->list); * Flush the PASID cache and IOTLB for this device.
/* Flush the PASID cache and IOTLB for this device. * Note that we do depend on the hardware *not* using
* Note that we do depend on the hardware *not* using * the PASID any more. Just as we depend on other
* the PASID any more. Just as we depend on other * devices never using PASIDs that they have no right
* devices never using PASIDs that they have no right * to use. We have a *shared* PASID table, because it's
* to use. We have a *shared* PASID table, because it's * large and has to be physically contiguous. So it's
* large and has to be physically contiguous. So it's * hard to be as defensive as we might like.
* hard to be as defensive as we might like. */ */
intel_pasid_tear_down_entry(iommu, dev, intel_pasid_tear_down_entry(iommu, dev, svm->pasid, false);
svm->pasid, false); intel_svm_drain_prq(dev, svm->pasid);
intel_svm_drain_prq(dev, svm->pasid); kfree_rcu(sdev, rcu);
kfree_rcu(sdev, rcu);
if (list_empty(&svm->devs)) {
if (list_empty(&svm->devs)) { if (svm->notifier.ops)
if (svm->notifier.ops) mmu_notifier_unregister(&svm->notifier, mm);
mmu_notifier_unregister(&svm->notifier, mm); pasid_private_remove(svm->pasid);
pasid_private_remove(svm->pasid); /*
/* We mandate that no page faults may be outstanding * We mandate that no page faults may be outstanding
* for the PASID when intel_svm_unbind_mm() is called. * for the PASID when intel_svm_unbind_mm() is called.
* If that is not obeyed, subtle errors will happen. * If that is not obeyed, subtle errors will happen.
* Let's make them less subtle... */ * Let's make them less subtle...
memset(svm, 0x6b, sizeof(*svm)); */
kfree(svm); memset(svm, 0x6b, sizeof(*svm));
} kfree(svm);
} }
} }
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment