]> git.ipfire.org Git - thirdparty/libvirt.git/commit
qemu: assign virtio devices to PCIe slot when appropriate
authorLaine Stump <laine@laine.org>
Sat, 13 Aug 2016 22:10:41 +0000 (18:10 -0400)
committerLaine Stump <laine@laine.org>
Mon, 14 Nov 2016 19:16:12 +0000 (14:16 -0500)
commitc7fc151eec74c7bbb380f78268a45d0d1e559d52
tree28777beccad836b391c0f63f786e293e97f7b163
parentb27375a9b86f010a9a9fc0323be3f204b62195f4
qemu: assign virtio devices to PCIe slot when appropriate

libvirt previously assigned nearly all devices to a "hotpluggable"
legacy PCI slot even on machines with a PCIe root bus (and even though
most such machines don't even support hotplug on legacy PCI slots!)
Forcing all devices onto legacy PCI slots 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 which, again,
usually aren't hotpluggable anyway).

To help reduce the need for these legacy controllers, this patch tries
to assign virtio-1.0-capable devices to PCIe slots whenever possible,
by setting appropriate connectFlags in
virDomainCalculateDevicePCIConnectFlags(). Happily, when that function
was written (just a few commits ago) it was created with a
"virtioFlags" argument, set by both of its callers, which is the
proper connectFlags to set for any virtio-*-pci device - depending on
the arch/machinetype of the domain, and whether or not the qemu binary
supports virtio-1.0, that flag will have either been set to PCI or
PCIe. This patch merely enables the functionality by setting the flags
for the device to whatever is in virtioFlags if the device is a
virtio-*-pci device.

NB: the first virtio video device will be placed directly on bus 0
slot 1 rather than on a pcie-root-port due to the override for primary
video devices in qemuDomainValidateDevicePCISlotsQ35(). Whether or not
to change that is a topic of discussion, but this patch doesn't change
that particular behavior.

NB2: 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
src/qemu/qemu_domain_address.c
tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.args [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-q35-pcie.xml [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-q35-virtio-pci.args [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-q35-virtio-pci.xml [new symlink]
tests/qemuxml2argvtest.c
tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-pcie.xml [new file with mode: 0644]
tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-virtio-pci.xml [new file with mode: 0644]
tests/qemuxml2xmltest.c