Commit 57629b75 authored by Yi Liu's avatar Yi Liu Committed by Jason Zeng
Browse files

iommu/vt-d: Wrap the dirty tracking loop to be a helper

mainline inclusion
from mainline-v6.8-rc6
commit 0c7f2497b39da44253d7bcf2b41f52b0048859ad
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I938E2
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0c7f2497b39da44253d7bcf2b41f52b0048859ad



--------------------------------

Add device_set_dirty_tracking() to loop all the devices and set the dirty
tracking per the @enable parameter.

Signed-off-by: default avatarYi Liu <yi.l.liu@intel.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarJoao Martins <joao.m.martins@oracle.com>
Link: https://lore.kernel.org/r/20240208082307.15759-8-yi.l.liu@intel.com


Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
Signed-off-by: default avatarJason Zeng <jason.zeng@intel.com>
parent 5c54c262
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -4713,23 +4713,38 @@ static void *intel_iommu_hw_info(struct device *dev, u32 *length, u32 *type)
	return vtd;
}

/*
 * Set dirty tracking for the device list of a domain. The caller must
 * hold the domain->lock when calling it.
 */
static int device_set_dirty_tracking(struct list_head *devices, bool enable)
{
	struct device_domain_info *info;
	int ret = 0;

	list_for_each_entry(info, devices, link) {
		ret = intel_pasid_setup_dirty_tracking(info->iommu, info->dev,
						       IOMMU_NO_PASID, enable);
		if (ret)
			break;
	}

	return ret;
}

static int intel_iommu_set_dirty_tracking(struct iommu_domain *domain,
					  bool enable)
{
	struct dmar_domain *dmar_domain = to_dmar_domain(domain);
	struct device_domain_info *info;
	int ret;

	spin_lock(&dmar_domain->lock);
	if (dmar_domain->dirty_tracking == enable)
		goto out_unlock;

	list_for_each_entry(info, &dmar_domain->devices, link) {
		ret = intel_pasid_setup_dirty_tracking(info->iommu, info->dev,
						       IOMMU_NO_PASID, enable);
	ret = device_set_dirty_tracking(&dmar_domain->devices, enable);
	if (ret)
		goto err_unwind;
	}

	dmar_domain->dirty_tracking = enable;
out_unlock:
@@ -4738,9 +4753,7 @@ static int intel_iommu_set_dirty_tracking(struct iommu_domain *domain,
	return 0;

err_unwind:
	list_for_each_entry(info, &dmar_domain->devices, link)
		intel_pasid_setup_dirty_tracking(info->iommu, info->dev,
						 IOMMU_NO_PASID,
	device_set_dirty_tracking(&dmar_domain->devices,
				  dmar_domain->dirty_tracking);
	spin_unlock(&dmar_domain->lock);
	return ret;