mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02: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:
parent
fe89277c9c
commit
39c20c4e83
|
|
@ -164,9 +164,12 @@ static int intel_svm_set_dev_pasid(struct iommu_domain *domain,
|
|||
if (IS_ERR(dev_pasid))
|
||||
return PTR_ERR(dev_pasid);
|
||||
|
||||
ret = iopf_for_domain_replace(domain, old, dev);
|
||||
if (ret)
|
||||
goto out_remove_dev_pasid;
|
||||
/* SVA with non-IOMMU/PRI IOPF handling is allowed. */
|
||||
if (info->pri_supported) {
|
||||
ret = iopf_for_domain_replace(domain, old, dev);
|
||||
if (ret)
|
||||
goto out_remove_dev_pasid;
|
||||
}
|
||||
|
||||
/* Setup the pasid table: */
|
||||
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;
|
||||
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:
|
||||
domain_remove_dev_pasid(domain, dev, pasid);
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user