]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/vt-d: Block PASID attachment to nested domain with dirty tracking
authorZhenzhong Duan <zhenzhong.duan@intel.com>
Thu, 2 Apr 2026 06:57:24 +0000 (14:57 +0800)
committerJoerg Roedel <joerg.roedel@amd.com>
Thu, 2 Apr 2026 07:26:04 +0000 (09:26 +0200)
Kernel lacks dirty tracking support on nested domain attached to PASID,
fails the attachment early if nesting parent domain is dirty tracking
configured, otherwise dirty pages would be lost.

Cc: stable@vger.kernel.org
Fixes: 67f6f56b5912 ("iommu/vt-d: Add set_dev_pasid callback for nested domain")
Suggested-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Yi Liu <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20260330101108.12594-2-zhenzhong.duan@intel.com
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Fixes: 67f6f56b5912 ("iommu/vt-d: Add set_dev_pasid callback for nested domain")
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/intel/nested.c

index 2b979bec56cefeff1a2391cfac0db1725dcdd2cb..16c82ba47d302bfc5d40298446a7bff6fc0c3327 100644 (file)
@@ -148,6 +148,7 @@ static int intel_nested_set_dev_pasid(struct iommu_domain *domain,
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
+       struct iommu_domain *s2_domain = &dmar_domain->s2_domain->domain;
        struct intel_iommu *iommu = info->iommu;
        struct dev_pasid_info *dev_pasid;
        int ret;
@@ -155,10 +156,13 @@ static int intel_nested_set_dev_pasid(struct iommu_domain *domain,
        if (!pasid_supported(iommu) || dev_is_real_dma_subdevice(dev))
                return -EOPNOTSUPP;
 
+       if (s2_domain->dirty_ops)
+               return -EINVAL;
+
        if (context_copied(iommu, info->bus, info->devfn))
                return -EBUSY;
 
-       ret = paging_domain_compatible(&dmar_domain->s2_domain->domain, dev);
+       ret = paging_domain_compatible(s2_domain, dev);
        if (ret)
                return ret;