vt-d: Map RMRR in intel_iommu_add_device() if the device has RMRR;

move domain_context_mapping() to be in front of list_move() in
reassign_device_ownership().

Signed-off-by: Weidong Han <weidong.han@intel.com>
This commit is contained in:
Keir Fraser committed 2008-07-25 09:44:48 +01:00
1 parent dba5b800e3
commit fa88cfadf9
1 file changed
+31 -2
+31 -2
View File
@@ -1409,12 +1409,15 @@ static int reassign_device_ownership(
pdev_iommu = drhd->iommu;
domain_context_unmap(source, bus, devfn);
ret = domain_context_mapping(target, bus, devfn);
if ( ret )
return ret;
write_lock(&pcidevs_lock);
list_move(&pdev->domain_list, &target->arch.pdev_list);
write_unlock(&pcidevs_lock);
pdev->domain = target;
ret = domain_context_mapping(target, bus, devfn);
spin_unlock(&pdev->lock);
read_lock(&pcidevs_lock);
@@ -1583,9 +1586,35 @@ static int iommu_prepare_rmrr_dev(struct domain *d,
static int intel_iommu_add_device(struct pci_dev *pdev)
{
struct acpi_rmrr_unit *rmrr;
u16 bdf;
int ret, i;
if ( !pdev->domain )
return -EINVAL;
return domain_context_mapping(pdev->domain, pdev->bus, pdev->devfn);
ret = domain_context_mapping(pdev->domain, pdev->bus, pdev->devfn);
if ( ret )
{
gdprintk(XENLOG_ERR VTDPREFIX,
"intel_iommu_add_device: context mapping failed\n");
return ret;
}
for_each_rmrr_device ( rmrr, bdf, i )
{
if ( PCI_BUS(bdf) == pdev->bus && PCI_DEVFN2(bdf) == pdev->devfn )
{
ret = iommu_prepare_rmrr_dev(pdev->domain, rmrr,
pdev->bus, pdev->devfn);
if ( ret )
gdprintk(XENLOG_ERR VTDPREFIX,
"intel_iommu_add_device: RMRR mapping failed\n");
break;
}
}
return ret;
}
static int intel_iommu_remove_device(struct pci_dev *pdev)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.