mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-05 04:41:20 +00:00
qemu: use virDomainPCIAddressSetAllMulti() to set multi when needed
If there are multiple devices assigned to the different functions of a single PCI slot, they will not work properly if the device at function 0 doesn't have its "multi" attribute turned on, so it makes sense for libvirt to turn it on during PCI address assignment. Setting multi then assures that the new setting is stored in the config (so it will be used next time the domain is started), preventing any potential problems in the case that a future change in the configuration eliminates the devices on all non-0 functions (multi will still be set for function 0 even though it is the only function in use on the slot, which has no useful purpose, but also doesn't cause any problems). (NB: If we were to instead just decide on the setting for multifunction at runtime, a later removal of the non-0 functions of a slot would result in a silent change in the guest ABI for the remaining device on function 0 (although it may seem like an inconsequential guest ABI change, it *is* a guest ABI change to turn off the multi bit).)
This commit is contained in:
parent
3c1a0fc27d
commit
8f4008713a
@ -2133,6 +2133,11 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
|
|||||||
if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
|
if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
/* set multi attribute for devices at function 0 of
|
||||||
|
* any slot that has multiple functions in use
|
||||||
|
*/
|
||||||
|
virDomainPCIAddressSetAllMulti(def);
|
||||||
|
|
||||||
for (i = 0; i < def->ncontrollers; i++) {
|
for (i = 0; i < def->ncontrollers; i++) {
|
||||||
virDomainControllerDefPtr cont = def->controllers[i];
|
virDomainControllerDefPtr cont = def->controllers[i];
|
||||||
int idx = cont->idx;
|
int idx = cont->idx;
|
||||||
|
42
tests/qemuxml2argvdata/qemuxml2argv-q35-multifunction.args
Normal file
42
tests/qemuxml2argvdata/qemuxml2argv-q35-multifunction.args
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/home/test \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/libexec/qemu-kvm \
|
||||||
|
-name q35-test \
|
||||||
|
-S \
|
||||||
|
-M q35 \
|
||||||
|
-m 2048 \
|
||||||
|
-smp 2,sockets=2,cores=1,threads=1 \
|
||||||
|
-uuid 11dbdcdd-4c3b-482b-8903-9bdb8c0a2774 \
|
||||||
|
-nographic \
|
||||||
|
-nodefaults \
|
||||||
|
-monitor unix:/tmp/lib/domain--1-q35-test/monitor.sock,server,nowait \
|
||||||
|
-no-acpi \
|
||||||
|
-boot c \
|
||||||
|
-device ioh3420,port=0x10,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,\
|
||||||
|
addr=0x2 \
|
||||||
|
-device ioh3420,port=0x11,chassis=2,id=pci.2,bus=pcie.0,addr=0x2.0x1 \
|
||||||
|
-device ioh3420,port=0x12,chassis=3,id=pci.3,bus=pcie.0,addr=0x2.0x2 \
|
||||||
|
-device ioh3420,port=0x18,chassis=4,id=pci.4,bus=pcie.0,multifunction=on,\
|
||||||
|
addr=0x3 \
|
||||||
|
-device ioh3420,port=0x19,chassis=5,id=pci.5,bus=pcie.0,multifunction=on,\
|
||||||
|
addr=0x3.0x1 \
|
||||||
|
-device ioh3420,port=0x20,chassis=6,id=pci.6,bus=pcie.0,multifunction=off,\
|
||||||
|
addr=0x4 \
|
||||||
|
-device ioh3420,port=0x21,chassis=7,id=pci.7,bus=pcie.0,addr=0x4.0x1 \
|
||||||
|
-device ioh3420,port=0x8,chassis=8,id=pci.8,bus=pcie.0,addr=0x1 \
|
||||||
|
-device ioh3420,port=0x28,chassis=9,id=pci.9,bus=pcie.0,addr=0x5 \
|
||||||
|
-device ioh3420,port=0x30,chassis=10,id=pci.10,bus=pcie.0,addr=0x6 \
|
||||||
|
-device ioh3420,port=0x38,chassis=11,id=pci.11,bus=pcie.0,addr=0x7 \
|
||||||
|
-device ioh3420,port=0x40,chassis=12,id=pci.12,bus=pcie.0,addr=0x8 \
|
||||||
|
-device ioh3420,port=0x48,chassis=13,id=pci.13,bus=pcie.0,addr=0x9 \
|
||||||
|
-device ioh3420,port=0x50,chassis=14,id=pci.14,bus=pcie.0,addr=0xa \
|
||||||
|
-device ioh3420,port=0x58,chassis=15,id=pci.15,bus=pcie.0,addr=0xb \
|
||||||
|
-device ioh3420,port=0x60,chassis=16,id=pci.16,bus=pcie.0,addr=0xc \
|
||||||
|
-device ioh3420,port=0x68,chassis=17,id=pci.17,bus=pcie.0,addr=0xd \
|
||||||
|
-device ioh3420,port=0x70,chassis=18,id=pci.18,bus=pcie.0,addr=0xe \
|
||||||
|
-device nec-usb-xhci,id=usb,bus=pci.1,addr=0x0 \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.2,addr=0x0
|
51
tests/qemuxml2argvdata/qemuxml2argv-q35-multifunction.xml
Normal file
51
tests/qemuxml2argvdata/qemuxml2argv-q35-multifunction.xml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>q35-test</name>
|
||||||
|
<uuid>11dbdcdd-4c3b-482b-8903-9bdb8c0a2774</uuid>
|
||||||
|
<memory unit='KiB'>2097152</memory>
|
||||||
|
<currentMemory unit='KiB'>2097152</currentMemory>
|
||||||
|
<vcpu placement='static' cpuset='0-1'>2</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='q35'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/libexec/qemu-kvm</emulator>
|
||||||
|
<controller type='pci' model='pcie-root'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='2' function='0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='2' function='1'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='2' function='2'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='3' function='0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='3' function='1' multifunction='on'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='4' function='0' multifunction='off'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'>
|
||||||
|
<address type='pci' slot='4' function='1'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
<controller type='pci' model='pcie-root-port'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -1938,6 +1938,29 @@ mymain(void)
|
|||||||
QEMU_CAPS_ICH9_USB_EHCI1,
|
QEMU_CAPS_ICH9_USB_EHCI1,
|
||||||
QEMU_CAPS_NEC_USB_XHCI,
|
QEMU_CAPS_NEC_USB_XHCI,
|
||||||
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
||||||
|
DO_TEST("q35-multifunction",
|
||||||
|
QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY,
|
||||||
|
QEMU_CAPS_DEVICE_VIRTIO_RNG,
|
||||||
|
QEMU_CAPS_OBJECT_RNG_RANDOM,
|
||||||
|
QEMU_CAPS_NETDEV,
|
||||||
|
QEMU_CAPS_DEVICE_VIRTIO_NET,
|
||||||
|
QEMU_CAPS_DEVICE_VIRTIO_GPU,
|
||||||
|
QEMU_CAPS_VIRTIO_GPU_VIRGL,
|
||||||
|
QEMU_CAPS_VIRTIO_KEYBOARD,
|
||||||
|
QEMU_CAPS_VIRTIO_MOUSE,
|
||||||
|
QEMU_CAPS_VIRTIO_TABLET,
|
||||||
|
QEMU_CAPS_VIRTIO_INPUT_HOST,
|
||||||
|
QEMU_CAPS_VIRTIO_SCSI,
|
||||||
|
QEMU_CAPS_FSDEV,
|
||||||
|
QEMU_CAPS_FSDEV_WRITEOUT,
|
||||||
|
QEMU_CAPS_DEVICE_PCI_BRIDGE,
|
||||||
|
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
|
||||||
|
QEMU_CAPS_DEVICE_IOH3420,
|
||||||
|
QEMU_CAPS_ICH9_AHCI,
|
||||||
|
QEMU_CAPS_PCI_MULTIFUNCTION,
|
||||||
|
QEMU_CAPS_ICH9_USB_EHCI1,
|
||||||
|
QEMU_CAPS_NEC_USB_XHCI,
|
||||||
|
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
||||||
DO_TEST("q35-virt-manager-basic",
|
DO_TEST("q35-virt-manager-basic",
|
||||||
QEMU_CAPS_KVM,
|
QEMU_CAPS_KVM,
|
||||||
QEMU_CAPS_RTC,
|
QEMU_CAPS_RTC,
|
||||||
|
120
tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-multifunction.xml
Normal file
120
tests/qemuxml2xmloutdata/qemuxml2xmlout-q35-multifunction.xml
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>q35-test</name>
|
||||||
|
<uuid>11dbdcdd-4c3b-482b-8903-9bdb8c0a2774</uuid>
|
||||||
|
<memory unit='KiB'>2097152</memory>
|
||||||
|
<currentMemory unit='KiB'>2097152</currentMemory>
|
||||||
|
<vcpu placement='static' cpuset='0-1'>2</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='q35'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/libexec/qemu-kvm</emulator>
|
||||||
|
<controller type='pci' index='0' model='pcie-root'/>
|
||||||
|
<controller type='pci' index='1' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='1' port='0x10'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='2' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='2' port='0x11'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='3' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='3' port='0x12'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='4' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='4' port='0x18'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='5' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='5' port='0x19'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1' multifunction='on'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='6' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='6' port='0x20'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='off'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='7' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='7' port='0x21'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='8' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='8' port='0x8'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='9' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='9' port='0x28'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='10' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='10' port='0x30'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='11' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='11' port='0x38'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='12' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='12' port='0x40'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='13' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='13' port='0x48'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='14' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='14' port='0x50'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='15' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='15' port='0x58'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='16' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='16' port='0x60'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='17' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='17' port='0x68'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x0d' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='18' model='pcie-root-port'>
|
||||||
|
<model name='ioh3420'/>
|
||||||
|
<target chassis='18' port='0x70'/>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x0e' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='usb' index='0' model='nec-xhci'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='sata' index='0'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
|
||||||
|
</controller>
|
||||||
|
<input type='mouse' bus='ps2'/>
|
||||||
|
<input type='keyboard' bus='ps2'/>
|
||||||
|
<memballoon model='virtio'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
|
||||||
|
</memballoon>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -795,6 +795,29 @@ mymain(void)
|
|||||||
QEMU_CAPS_ICH9_USB_EHCI1,
|
QEMU_CAPS_ICH9_USB_EHCI1,
|
||||||
QEMU_CAPS_NEC_USB_XHCI,
|
QEMU_CAPS_NEC_USB_XHCI,
|
||||||
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
||||||
|
DO_TEST("q35-multifunction",
|
||||||
|
QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY,
|
||||||
|
QEMU_CAPS_DEVICE_VIRTIO_RNG,
|
||||||
|
QEMU_CAPS_OBJECT_RNG_RANDOM,
|
||||||
|
QEMU_CAPS_NETDEV,
|
||||||
|
QEMU_CAPS_DEVICE_VIRTIO_NET,
|
||||||
|
QEMU_CAPS_DEVICE_VIRTIO_GPU,
|
||||||
|
QEMU_CAPS_VIRTIO_GPU_VIRGL,
|
||||||
|
QEMU_CAPS_VIRTIO_KEYBOARD,
|
||||||
|
QEMU_CAPS_VIRTIO_MOUSE,
|
||||||
|
QEMU_CAPS_VIRTIO_TABLET,
|
||||||
|
QEMU_CAPS_VIRTIO_INPUT_HOST,
|
||||||
|
QEMU_CAPS_VIRTIO_SCSI,
|
||||||
|
QEMU_CAPS_FSDEV,
|
||||||
|
QEMU_CAPS_FSDEV_WRITEOUT,
|
||||||
|
QEMU_CAPS_DEVICE_PCI_BRIDGE,
|
||||||
|
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE,
|
||||||
|
QEMU_CAPS_DEVICE_IOH3420,
|
||||||
|
QEMU_CAPS_ICH9_AHCI,
|
||||||
|
QEMU_CAPS_PCI_MULTIFUNCTION,
|
||||||
|
QEMU_CAPS_ICH9_USB_EHCI1,
|
||||||
|
QEMU_CAPS_NEC_USB_XHCI,
|
||||||
|
QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
|
||||||
DO_TEST("q35-virt-manager-basic",
|
DO_TEST("q35-virt-manager-basic",
|
||||||
QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY,
|
QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY,
|
||||||
QEMU_CAPS_DEVICE_VIRTIO_RNG,
|
QEMU_CAPS_DEVICE_VIRTIO_RNG,
|
||||||
|
Loading…
Reference in New Issue
Block a user