mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 18:03:10 -04:00
iommu/vt-d: Only handle IOPF for SVA when PRI is supported
In intel_svm_set_dev_pasid(), the driver unconditionally manages the IOPF handling during a domain transition. However, commita86fb77173("iommu/vt-d: Allow SVA with device-specific IOPF") introduced support for SVA on devices that handle page faults internally without utilizing the PCI PRI. On such devices, the IOMMU-side IOPF infrastructure is not required. Calling iopf_for_domain_replace() on these devices is incorrect and can lead to unexpected failures during PASID attachment or unwinding. Add a check for info->pri_supported to ensure that the IOPF queue logic is only invoked for devices that actually rely on the IOMMU's PRI-based fault handling. Fixes:17fce9d233("iommu/vt-d: Put iopf enablement in domain attach path") Cc: stable@vger.kernel.org Suggested-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Link: https://lore.kernel.org/r/20260310075520.295104-1-baolu.lu@linux.intel.com Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
@@ -164,9 +164,12 @@ static int intel_svm_set_dev_pasid(struct iommu_domain *domain,
|
|||||||
if (IS_ERR(dev_pasid))
|
if (IS_ERR(dev_pasid))
|
||||||
return PTR_ERR(dev_pasid);
|
return PTR_ERR(dev_pasid);
|
||||||
|
|
||||||
ret = iopf_for_domain_replace(domain, old, dev);
|
/* SVA with non-IOMMU/PRI IOPF handling is allowed. */
|
||||||
if (ret)
|
if (info->pri_supported) {
|
||||||
goto out_remove_dev_pasid;
|
ret = iopf_for_domain_replace(domain, old, dev);
|
||||||
|
if (ret)
|
||||||
|
goto out_remove_dev_pasid;
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup the pasid table: */
|
/* Setup the pasid table: */
|
||||||
sflags = cpu_feature_enabled(X86_FEATURE_LA57) ? PASID_FLAG_FL5LP : 0;
|
sflags = cpu_feature_enabled(X86_FEATURE_LA57) ? PASID_FLAG_FL5LP : 0;
|
||||||
@@ -181,7 +184,8 @@ static int intel_svm_set_dev_pasid(struct iommu_domain *domain,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
out_unwind_iopf:
|
out_unwind_iopf:
|
||||||
iopf_for_domain_replace(old, domain, dev);
|
if (info->pri_supported)
|
||||||
|
iopf_for_domain_replace(old, domain, dev);
|
||||||
out_remove_dev_pasid:
|
out_remove_dev_pasid:
|
||||||
domain_remove_dev_pasid(domain, dev, pasid);
|
domain_remove_dev_pasid(domain, dev, pasid);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user