
On Wed, 2016-08-17 at 07:29 -0400, Laine Stump wrote:
libvirt previously assigned nearly all devices to a hotpluggable legacy PCI slot even on machines with a PCIe root complex. Doing this means that the domain will need a dmi-to-pci-bridge (to convert from PCIe to legacy PCI) and a pci-bridge (to provide hotpluggable legacy PCI slots. To help reduce the need for these legacy controllers, this patch checks for the QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY capability (if that capability is present, then all virtio devices will automatically present as PCIe when attached to a PCIe controller, or PCI when attached to a legacy PCI controller), and assigns virtio devices to a hotpluggable PCIe slot instead. NB: since the slot must be hotpluggable, and pcie-root (the PCIe root complex) does *not* support hotplug, this means that suitable controllers must also be in the config (i.e. either pcie-root-port, or pcie-downstream-port). For now, libvirt doesn't add those automatically, so if you put virtio devices in a config for a qemu that has PCIe-capable virtio devices, you'll need to add extra pcie-root-ports yourself. That requirement will be eliminated in a future patch, but for now, it's simple to do this: <controller type='pci' model='pcie-root-port'/> <controller type='pci' model='pcie-root-port'/> <controller type='pci' model='pcie-root-port'/> ... Partially Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1330024 ---
[...]
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 3d52d72..73f4241 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -996,16 +996,25 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, virDomainPCIAddressSetPtr addrs) { size_t i, j; - virDomainPCIConnectFlags flags = 0; /* initialize to quiet gcc warning */ + virDomainPCIConnectFlags virtioFlags; + virDomainPCIConnectFlags pciFlags; + virDomainPCIConnectFlags pcieFlags; virPCIDeviceAddress tmp_addr; + bool havePCIeRoot = false; /* PCI controllers */ for (i = 0; i < def->ncontrollers; i++) { if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) { virDomainControllerModelPCI model = def->controllers[i]->model; + virDomainPCIConnectFlags flags; + flags = virDomainPCIControllerModelToConnectType(model);
You moved this function call, but left the comment referring to it in the original position. Please move the comment as well.
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 7601a5f..ffd1792 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -691,6 +691,46 @@ mymain(void) QEMU_CAPS_ICH9_AHCI, QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_VGA_QXL, QEMU_CAPS_DEVICE_QXL);
Please carry over the same comment you added to qemuxml2argvtest.
+ DO_TEST("q35-pcie", + QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY, + QEMU_CAPS_DEVICE_VIRTIO_RNG,
ACK -- Andrea Bolognani / Red Hat / Virtualization