[libvirt] [PATCH v3 2/4] qemu: assign virtio devices to PCIe slot when appropriate
Andrea Bolognani
abologna at redhat.com
Fri Aug 19 11:42:25 UTC 2016
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
More information about the libvir-list
mailing list