• L
    qemu: assign virtio devices to PCIe slot when appropriate · c7fc151e
    Laine Stump 提交于
    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
    c7fc151e
qemuxml2xmlout-q35-virtio-pci.xml 6.6 KB