mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
VT-d: fix add/remove ordering when RMRRs are in use
In the event that the RMRR mappings are essential for device operation, they should be established before updating the device's context entry, while they should be torn down only after the device's context entry was successfully cleared. Also switch to %pd in related log messages. Fixes:fa88cfadf9("vt-d: Map RMRR in intel_iommu_add_device() if the device has RMRR") Fixes:8b99f4400b("VT-d: fix RMRR related error handling") Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> master commit:3221f270cfmaster date: 2022-04-05 14:16:10 +0200
This commit is contained in:
1 parent
650b888c8a
commit
81918cead1
1 file changed
+14
-13
@@ -1993,14 +1993,6 @@ static int intel_iommu_add_device(u8 devfn, struct pci_dev *pdev)
|
||||
if ( !pdev->domain )
|
||||
return -EINVAL;
|
||||
|
||||
ret = domain_context_mapping(pdev->domain, devfn, pdev);
|
||||
if ( ret )
|
||||
{
|
||||
dprintk(XENLOG_ERR VTDPREFIX, "d%d: context mapping failed\n",
|
||||
pdev->domain->domain_id);
|
||||
return ret;
|
||||
}
|
||||
|
||||
for_each_rmrr_device ( rmrr, bdf, i )
|
||||
{
|
||||
if ( rmrr->segment == pdev->seg &&
|
||||
@@ -2017,12 +2009,17 @@ static int intel_iommu_add_device(u8 devfn, struct pci_dev *pdev)
|
||||
rmrr->base_address, rmrr->end_address,
|
||||
0);
|
||||
if ( ret )
|
||||
dprintk(XENLOG_ERR VTDPREFIX, "d%d: RMRR mapping failed\n",
|
||||
pdev->domain->domain_id);
|
||||
dprintk(XENLOG_ERR VTDPREFIX, "%pd: RMRR mapping failed\n",
|
||||
pdev->domain);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
ret = domain_context_mapping(pdev->domain, devfn, pdev);
|
||||
if ( ret )
|
||||
dprintk(XENLOG_ERR VTDPREFIX, "%pd: context mapping failed\n",
|
||||
pdev->domain);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int intel_iommu_enable_device(struct pci_dev *pdev)
|
||||
@@ -2044,11 +2041,15 @@ static int intel_iommu_remove_device(u8 devfn, struct pci_dev *pdev)
|
||||
{
|
||||
struct acpi_rmrr_unit *rmrr;
|
||||
u16 bdf;
|
||||
int i;
|
||||
int ret, i;
|
||||
|
||||
if ( !pdev->domain )
|
||||
return -EINVAL;
|
||||
|
||||
ret = domain_context_unmap(pdev->domain, devfn, pdev);
|
||||
if ( ret )
|
||||
return ret;
|
||||
|
||||
for_each_rmrr_device ( rmrr, bdf, i )
|
||||
{
|
||||
if ( rmrr->segment != pdev->seg ||
|
||||
@@ -2064,7 +2065,7 @@ static int intel_iommu_remove_device(u8 devfn, struct pci_dev *pdev)
|
||||
rmrr->end_address, 0);
|
||||
}
|
||||
|
||||
return domain_context_unmap(pdev->domain, devfn, pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __hwdom_init setup_hwdom_device(u8 devfn, struct pci_dev *pdev)
|
||||
|
||||