Skip to content
/ linux Public

Commit ee312bb

Browse files
LuBaolugregkh
authored andcommitted
iommu/vt-d: Only handle IOPF for SVA when PRI is supported
commit 39c20c4 upstream. In intel_svm_set_dev_pasid(), the driver unconditionally manages the IOPF handling during a domain transition. However, commit a86fb77 ("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: 17fce9d ("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 300e7cf commit ee312bb

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

drivers/iommu/intel/svm.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,12 @@ static int intel_svm_set_dev_pasid(struct iommu_domain *domain,
164164
if (IS_ERR(dev_pasid))
165165
return PTR_ERR(dev_pasid);
166166

167-
ret = iopf_for_domain_replace(domain, old, dev);
168-
if (ret)
169-
goto out_remove_dev_pasid;
167+
/* SVA with non-IOMMU/PRI IOPF handling is allowed. */
168+
if (info->pri_supported) {
169+
ret = iopf_for_domain_replace(domain, old, dev);
170+
if (ret)
171+
goto out_remove_dev_pasid;
172+
}
170173

171174
/* Setup the pasid table: */
172175
sflags = cpu_feature_enabled(X86_FEATURE_LA57) ? PASID_FLAG_FL5LP : 0;
@@ -180,7 +183,8 @@ static int intel_svm_set_dev_pasid(struct iommu_domain *domain,
180183

181184
return 0;
182185
out_unwind_iopf:
183-
iopf_for_domain_replace(old, domain, dev);
186+
if (info->pri_supported)
187+
iopf_for_domain_replace(old, domain, dev);
184188
out_remove_dev_pasid:
185189
domain_remove_dev_pasid(domain, dev, pasid);
186190
return ret;

0 commit comments

Comments
 (0)