[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