On 10/06/2016 10:13 AM, Andrea Bolognani wrote:
On Tue, 2016-09-20 at 15:14 -0400, Laine Stump wrote:
> 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
> virDomainDeviceConnectFlagsInternal(). 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: 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
[...]
> + <video>
> + <model type='virtio' heads='1' primary='yes'/>
> + <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
I was initially baffled by this, because I expected it to
be assigned to one of the available pcie-root-ports just
like all the other virtio devices.
However, according to qemuDomainValidateDevicePCISlotsQ35()
this is intentional, so I guess we're good :)
Actually, you bring up an interesting point in light of the "Should PCIe
devices ever be placed directly on pcie-root?" debate on qemu-devel (I
think it was in the thread about the PCI topology document that Marcel
is writing). We currently always put the primary video device at 00:1
just because "we always have", and it has the nice side effect of
eliminating the need for legacy-PCI controllers. But in this one case
the device is PCIe - to follow Marcel's recommendation of putting only
legacy devices on pcie-root, we should be putting the virtio video
device on a root-port.
As I recall, Marcel and Alex were the most vocal on this subject, so I'm
Cc'ing them, with this bit of context - this patch auto-assigns the
addresses for virtio devices to be on Express ports rather than legacy
slots when appropriate, but there is a bit of Q35-specific code that
overrides any of that and always places the primary video device at
00:01.0 - should we still do that for the primary video if it's virtio?
Or should we put it behind a root-port?
One improvement I can recommend to this test case is to add
one more pcie-root-port, so that it becomes quite clear
that virtio-vga has been assigned to pcie-root on purpose
and *not* due to a lack of pcie-root-ports.
Or possibly change the behavior for virtio video even if it's the
primary (note to self - check if someone has done the patch to allow
multiple virtio video devices yet)