From 8c6dba054b012ad3d71bccc5b25cf297681d81d3 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Wed, 17 Jun 2020 16:18:23 -0400 Subject: [PATCH] qemu: auto-assign hostdev devices to PCIe Until recently, an would automatically be assigned model "rtl8139", which in turn would lead to the device being assigned a PCI address on a conventional PCI controller (i.e. a pcie-to-pci-bridge). If the network was a typical Linux host bridge-based network that used an emulated device, this would be appropriate, since the guest actually would get an emulated rtl8139 NIC, and that device is a conventional PCI device. However, if the network being used was a pool of hostdev devices, the guest would get an actual PCIe network device assigned from the host via VFIO; while the interface model in that case is irrelevant for the QEMU commandline to assign the device, the PCI address would have already been assigned prior to runtime, so the address assignment would be done based on the model='rtl8139' - a conventional PCI device. VFIO assignment of a PCIe device to a conventional PCI slot works, but we would rather have these devices in a PCIe slot. Since commit bdb8f2e4186, if points to a etwork that is a pool of hostdev devices, the interface model will be _unset_ by default. This patch uses that information when deciding what type of slot to assign to the device: since all hostdev network interfaces are SR-IOV VFs, and *all* SR-IOV network cards are PCIe, it is safe to assume that the VFs are PCIe and we should assign then to a PCIe slot in the guest. Signed-off-by: Laine Stump Reviewed-by: Andrea Bolognani --- src/qemu/qemu_domain_address.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 4c26070022..d2a0bd9c02 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -737,6 +737,14 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, if (net->model == VIR_DOMAIN_NET_MODEL_E1000E) return pcieFlags; + /* the only time model can be "unknown" is for type='hostdev' + * or for type='network' where the network is a pool of + * hostdev devices. These will always be pcie on the host, and + * should be pcie in the guest if it supports pcie. + */ + if (net->model == VIR_DOMAIN_NET_MODEL_UNKNOWN) + return pcieFlags; + return pciFlags; } -- 2.39.5