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:
Jan Beulich committed 2021-09-16 11:02:08 +02:00
1 parent 737190abb1
commit 418b4d5741
1 file changed
+16 -13
+16 -13
View File
@@ -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));
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.