VT-d: don't leak domid mapping on error path
authorJan Beulich <jbeulich@suse.com>
Thu, 6 Jan 2022 13:11:23 +0000 (14:11 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 6 Jan 2022 13:11:23 +0000 (14:11 +0100)
While domain_context_mapping() invokes domain_context_unmap() in a sub-
case of handling DEV_TYPE_PCI when encountering an error, thus avoiding
a leak, individual calls to domain_context_mapping_one() aren't
similarly covered. Such a leak might persist until domain destruction.
Leverage that these cases can be recognized by pdev being non-NULL.

Fixes: dec403cc668f ("VT-d: fix iommu_domid for PCI/PCIx devices assignment")
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
master commit: e6252a51faf42c892eb5fc71f8a2617580832196
master date: 2021-11-24 11:07:11 +0100

xen/drivers/passthrough/vtd/iommu.c

index de11c258ca688464376b95c394d6bb25ffa86896..3b37bad25e878f32233185e48e3ea94f62b7ebac 100644 (file)
@@ -1517,7 +1517,12 @@ int domain_context_mapping_one(
         rc = me_wifi_quirk(domain, bus, devfn, MAP_ME_PHANTOM_FUNC);
 
     if ( rc )
-        domain_context_unmap_one(domain, iommu, bus, devfn);
+    {
+        ret = domain_context_unmap_one(domain, iommu, bus, devfn);
+
+        if ( !ret && pdev && pdev->devfn == devfn )
+            check_cleanup_domid_map(domain, pdev, iommu);
+    }
 
     return rc;
 }