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

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.com


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 557abbd6
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -762,7 +762,6 @@ struct intel_svm_dev {
	struct device *dev;
	struct intel_iommu *iommu;
	struct iommu_sva sva;
	int users;
	u16 did;
	u16 sid, qdep;
};
+27 −35
Original line number Diff line number Diff line
@@ -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);
	if (!sdev) {
		ret = -ENOMEM;
@@ -350,7 +343,6 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
	sdev->iommu = iommu;
	sdev->did = FLPT_DEFAULT_DID;
	sdev->sid = PCI_DEVID(info->bus, info->devfn);
	sdev->users = 1;
	sdev->sva.dev = dev;
	init_rcu_head(&sdev->rcu);
	if (info->ats_enabled) {
@@ -367,7 +359,7 @@ static struct iommu_sva *intel_svm_bind_mm(struct intel_iommu *iommu,
		goto free_sdev;

	list_add_rcu(&sdev->list, &svm->devs);
success:

	return &sdev->sva;

free_sdev:
@@ -401,18 +393,17 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid)
	mm = svm->mm;

	if (sdev) {
		sdev->users--;
		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
		 * the PASID any more. Just as we depend on other
		 * devices never using PASIDs that they have no right
		 * to use. We have a *shared* PASID table, because it's
		 * large and has to be physically contiguous. So it's
			 * hard to be as defensive as we might like. */
			intel_pasid_tear_down_entry(iommu, dev,
						    svm->pasid, false);
		 * hard to be as defensive as we might like.
		 */
		intel_pasid_tear_down_entry(iommu, dev, svm->pasid, false);
		intel_svm_drain_prq(dev, svm->pasid);
		kfree_rcu(sdev, rcu);

@@ -420,15 +411,16 @@ static int intel_svm_unbind_mm(struct device *dev, u32 pasid)
			if (svm->notifier.ops)
				mmu_notifier_unregister(&svm->notifier, mm);
			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.
			 * 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);
		}
	}
	}
out:
	return ret;
}