> From: Jan Beulich <jbeul...@suse.com> > Sent: Friday, November 12, 2021 5:49 PM > > 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 <jbeul...@suse.com>
Reviewed-by: Kevin Tian <kevin.t...@intel.com> > --- > The Fixes: tag isn't strictly correct, as error handling had more severe > shortcomings at the time. But I wouldn't want to blame a commit > improving error handling to have introduced the leak. > > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -1518,7 +1518,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; > }