mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
VT-d: defer "no DRHD" check when (un)mapping devices
If devices are to be skipped anyway (which is the case in particular for host bridges), there's no point complaining about a missing DRHD (and hence a missing association with an IOMMU). While there convert assignments to initializers and constify "drhd" local variables. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
1 parent
737190abb1
commit
418b4d5741
1 file changed
+16
-13
@@ -1460,14 +1460,10 @@ static int domain_context_unmap(struct domain *d, uint8_t devfn,
|
||||
static int domain_context_mapping(struct domain *domain, u8 devfn,
|
||||
struct pci_dev *pdev)
|
||||
{
|
||||
struct acpi_drhd_unit *drhd;
|
||||
const struct acpi_drhd_unit *drhd = acpi_find_matched_drhd_unit(pdev);
|
||||
int ret = 0;
|
||||
u8 seg = pdev->seg, bus = pdev->bus, secbus;
|
||||
|
||||
drhd = acpi_find_matched_drhd_unit(pdev);
|
||||
if ( !drhd )
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* Generally we assume only devices from one node to get assigned to a
|
||||
* given guest. But even if not, by replacing the prior value here we
|
||||
@@ -1476,7 +1472,7 @@ static int domain_context_mapping(struct domain *domain, u8 devfn,
|
||||
* this or other devices may be penalized then, but some would also be
|
||||
* if we left other than NUMA_NO_NODE untouched here.
|
||||
*/
|
||||
if ( drhd->iommu->node != NUMA_NO_NODE )
|
||||
if ( drhd && drhd->iommu->node != NUMA_NO_NODE )
|
||||
dom_iommu(domain)->node = drhd->iommu->node;
|
||||
|
||||
ASSERT(pcidevs_locked());
|
||||
@@ -1497,6 +1493,9 @@ static int domain_context_mapping(struct domain *domain, u8 devfn,
|
||||
break;
|
||||
|
||||
case DEV_TYPE_PCIe_ENDPOINT:
|
||||
if ( !drhd )
|
||||
return -ENODEV;
|
||||
|
||||
if ( iommu_debug )
|
||||
printk(VTDPREFIX "%pd:PCIe: map %pp\n",
|
||||
domain, &PCI_SBDF3(seg, bus, devfn));
|
||||
@@ -1508,6 +1507,9 @@ static int domain_context_mapping(struct domain *domain, u8 devfn,
|
||||
break;
|
||||
|
||||
case DEV_TYPE_PCI:
|
||||
if ( !drhd )
|
||||
return -ENODEV;
|
||||
|
||||
if ( iommu_debug )
|
||||
printk(VTDPREFIX "%pd:PCI: map %pp\n",
|
||||
domain, &PCI_SBDF3(seg, bus, devfn));
|
||||
@@ -1651,17 +1653,12 @@ int domain_context_unmap_one(
|
||||
static int domain_context_unmap(struct domain *domain, u8 devfn,
|
||||
struct pci_dev *pdev)
|
||||
{
|
||||
struct acpi_drhd_unit *drhd;
|
||||
struct vtd_iommu *iommu;
|
||||
const struct acpi_drhd_unit *drhd = acpi_find_matched_drhd_unit(pdev);
|
||||
struct vtd_iommu *iommu = drhd ? drhd->iommu : NULL;
|
||||
int ret;
|
||||
u8 seg = pdev->seg, bus = pdev->bus, tmp_bus, tmp_devfn, secbus;
|
||||
int found = 0;
|
||||
|
||||
drhd = acpi_find_matched_drhd_unit(pdev);
|
||||
if ( !drhd )
|
||||
return -ENODEV;
|
||||
iommu = drhd->iommu;
|
||||
|
||||
switch ( pdev->type )
|
||||
{
|
||||
case DEV_TYPE_PCI_HOST_BRIDGE:
|
||||
@@ -1676,6 +1673,9 @@ static int domain_context_unmap(struct domain *domain, u8 devfn,
|
||||
return 0;
|
||||
|
||||
case DEV_TYPE_PCIe_ENDPOINT:
|
||||
if ( !iommu )
|
||||
return -ENODEV;
|
||||
|
||||
if ( iommu_debug )
|
||||
printk(VTDPREFIX "%pd:PCIe: unmap %pp\n",
|
||||
domain, &PCI_SBDF3(seg, bus, devfn));
|
||||
@@ -1686,6 +1686,9 @@ static int domain_context_unmap(struct domain *domain, u8 devfn,
|
||||
break;
|
||||
|
||||
case DEV_TYPE_PCI:
|
||||
if ( !iommu )
|
||||
return -ENODEV;
|
||||
|
||||
if ( iommu_debug )
|
||||
printk(VTDPREFIX "%pd:PCI: unmap %pp\n",
|
||||
domain, &PCI_SBDF3(seg, bus, devfn));
|
||||
|
||||