forked from rpms/libvirt
215 lines
7.9 KiB
Diff
215 lines
7.9 KiB
Diff
From b56deb73400af9518bdc86802b8ac8da0670d806 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <b56deb73400af9518bdc86802b8ac8da0670d806@dist-git>
|
|
From: Laine Stump <laine@laine.org>
|
|
Date: Thu, 10 Jan 2019 09:44:45 -0500
|
|
Subject: [PATCH] conf: correct false boot order error during domain parse
|
|
|
|
virDomainDefCollectBootOrder() is called for every item on the list
|
|
for each type of device. One of the checks it makes is to gather the
|
|
order attributes from the <boot> element of all devices, and assure
|
|
that no two devices have been given the same order.
|
|
|
|
Since (internally to libvirt, *not* in the domain XML) an <interface
|
|
type='hostdev'> is on both the list of hostdev devices and the list of
|
|
network devices, it will be counted twice, and the code that checks
|
|
for multiple devices with the same boot order will give a false
|
|
positive.
|
|
|
|
To remedy this, we make sure to return early for hostdev devices that
|
|
have a parent.type != NONE.
|
|
|
|
This was introduced in commit 5b75a4, which was first in libvirt-4.4.0.
|
|
|
|
Resolves: https://bugzilla.redhat.com/1630393 (RHEL8)
|
|
Resolves: https://bugzilla.redhat.com/1601318 (RHEL7)
|
|
|
|
Change from upstream: upstream has eliminated QEMU_CAPS_BOOTINDEX and
|
|
QEMU_CAPS_PCI_BOOTINDEX so they're no longer necessary in test cases.
|
|
|
|
Signed-off-by: Laine Stump <laine@laine.org>
|
|
(cherry picked from commit 7ea7342996d74591e00bcbf14b1eb3995f77a199)
|
|
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
|
|
---
|
|
src/conf/domain_conf.c | 8 ++++
|
|
.../net-hostdev-bootorder.args | 27 ++++++++++++
|
|
.../net-hostdev-bootorder.xml | 36 ++++++++++++++++
|
|
tests/qemuxml2argvtest.c | 3 ++
|
|
.../net-hostdev-bootorder.xml | 42 +++++++++++++++++++
|
|
tests/qemuxml2xmltest.c | 1 +
|
|
6 files changed, 117 insertions(+)
|
|
create mode 100644 tests/qemuxml2argvdata/net-hostdev-bootorder.args
|
|
create mode 100644 tests/qemuxml2argvdata/net-hostdev-bootorder.xml
|
|
create mode 100644 tests/qemuxml2xmloutdata/net-hostdev-bootorder.xml
|
|
|
|
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
|
|
index 660e1523fe..d431441f62 100644
|
|
--- a/src/conf/domain_conf.c
|
|
+++ b/src/conf/domain_conf.c
|
|
@@ -5076,6 +5076,14 @@ virDomainDefCollectBootOrder(virDomainDefPtr def ATTRIBUTE_UNUSED,
|
|
if (info->bootIndex == 0)
|
|
return 0;
|
|
|
|
+ if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
|
|
+ dev->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE) {
|
|
+ /* This hostdev is a child of a higher level device
|
|
+ * (e.g. interface), and thus already being counted on the
|
|
+ * list for the other device type.
|
|
+ */
|
|
+ return 0;
|
|
+ }
|
|
if (virAsprintf(&order, "%u", info->bootIndex) < 0)
|
|
goto cleanup;
|
|
|
|
diff --git a/tests/qemuxml2argvdata/net-hostdev-bootorder.args b/tests/qemuxml2argvdata/net-hostdev-bootorder.args
|
|
new file mode 100644
|
|
index 0000000000..e632d9b195
|
|
--- /dev/null
|
|
+++ b/tests/qemuxml2argvdata/net-hostdev-bootorder.args
|
|
@@ -0,0 +1,27 @@
|
|
+LC_ALL=C \
|
|
+PATH=/bin \
|
|
+HOME=/home/test \
|
|
+USER=test \
|
|
+LOGNAME=test \
|
|
+QEMU_AUDIO_DRV=none \
|
|
+/usr/bin/qemu-system-i686 \
|
|
+-name QEMUGuest1 \
|
|
+-S \
|
|
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
|
|
+-m 214 \
|
|
+-smp 1,sockets=1,cores=1,threads=1 \
|
|
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
|
+-display none \
|
|
+-no-user-config \
|
|
+-nodefaults \
|
|
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
|
|
+server,nowait \
|
|
+-mon chardev=charmonitor,id=monitor,mode=control \
|
|
+-rtc base=utc \
|
|
+-no-shutdown \
|
|
+-no-acpi \
|
|
+-usb \
|
|
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \
|
|
+-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,\
|
|
+bootindex=2 \
|
|
+-device pci-assign,host=03:07.1,id=hostdev0,bootindex=1,bus=pci.0,addr=0x3
|
|
diff --git a/tests/qemuxml2argvdata/net-hostdev-bootorder.xml b/tests/qemuxml2argvdata/net-hostdev-bootorder.xml
|
|
new file mode 100644
|
|
index 0000000000..cd9f32b2f3
|
|
--- /dev/null
|
|
+++ b/tests/qemuxml2argvdata/net-hostdev-bootorder.xml
|
|
@@ -0,0 +1,36 @@
|
|
+<domain type='qemu'>
|
|
+ <name>QEMUGuest1</name>
|
|
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
|
+ <memory unit='KiB'>219136</memory>
|
|
+ <currentMemory unit='KiB'>219136</currentMemory>
|
|
+ <vcpu placement='static'>1</vcpu>
|
|
+ <os>
|
|
+ <type arch='i686' machine='pc'>hvm</type>
|
|
+ </os>
|
|
+ <clock offset='utc'/>
|
|
+ <on_poweroff>destroy</on_poweroff>
|
|
+ <on_reboot>restart</on_reboot>
|
|
+ <on_crash>destroy</on_crash>
|
|
+ <devices>
|
|
+ <emulator>/usr/bin/qemu-system-i686</emulator>
|
|
+ <disk type='block' device='disk'>
|
|
+ <source dev='/dev/HostVG/QEMUGuest1'/>
|
|
+ <target dev='hda' bus='ide'/>
|
|
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
|
+ <boot order='2'/>
|
|
+ </disk>
|
|
+ <controller type='usb' index='0'/>
|
|
+ <controller type='ide' index='0'/>
|
|
+ <controller type='pci' index='0' model='pci-root'/>
|
|
+ <interface type='hostdev' managed='yes'>
|
|
+ <mac address='00:11:22:33:44:55'/>
|
|
+ <source>
|
|
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x07' function='0x1'/>
|
|
+ </source>
|
|
+ <boot order='1'/>
|
|
+ </interface>
|
|
+ <input type='mouse' bus='ps2'/>
|
|
+ <input type='keyboard' bus='ps2'/>
|
|
+ <memballoon model='none'/>
|
|
+ </devices>
|
|
+</domain>
|
|
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
|
|
index bd4aa1266d..690a39054e 100644
|
|
--- a/tests/qemuxml2argvtest.c
|
|
+++ b/tests/qemuxml2argvtest.c
|
|
@@ -1324,6 +1324,9 @@ mymain(void)
|
|
DO_TEST("net-mcast", NONE);
|
|
DO_TEST("net-udp", NONE);
|
|
DO_TEST("net-hostdev", NONE);
|
|
+ DO_TEST("net-hostdev-bootorder",
|
|
+ QEMU_CAPS_BOOTINDEX,
|
|
+ QEMU_CAPS_PCI_BOOTINDEX);
|
|
DO_TEST("net-hostdev-multidomain", NONE);
|
|
DO_TEST("net-hostdev-vfio",
|
|
QEMU_CAPS_DEVICE_VFIO_PCI);
|
|
diff --git a/tests/qemuxml2xmloutdata/net-hostdev-bootorder.xml b/tests/qemuxml2xmloutdata/net-hostdev-bootorder.xml
|
|
new file mode 100644
|
|
index 0000000000..d9ecf40cf0
|
|
--- /dev/null
|
|
+++ b/tests/qemuxml2xmloutdata/net-hostdev-bootorder.xml
|
|
@@ -0,0 +1,42 @@
|
|
+<domain type='qemu'>
|
|
+ <name>QEMUGuest1</name>
|
|
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
|
+ <memory unit='KiB'>219136</memory>
|
|
+ <currentMemory unit='KiB'>219136</currentMemory>
|
|
+ <vcpu placement='static'>1</vcpu>
|
|
+ <os>
|
|
+ <type arch='i686' machine='pc'>hvm</type>
|
|
+ </os>
|
|
+ <clock offset='utc'/>
|
|
+ <on_poweroff>destroy</on_poweroff>
|
|
+ <on_reboot>restart</on_reboot>
|
|
+ <on_crash>destroy</on_crash>
|
|
+ <devices>
|
|
+ <emulator>/usr/bin/qemu-system-i686</emulator>
|
|
+ <disk type='block' device='disk'>
|
|
+ <driver name='qemu' type='raw'/>
|
|
+ <source dev='/dev/HostVG/QEMUGuest1'/>
|
|
+ <target dev='hda' bus='ide'/>
|
|
+ <boot order='2'/>
|
|
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
|
+ </disk>
|
|
+ <controller type='usb' index='0'>
|
|
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
|
+ </controller>
|
|
+ <controller type='ide' index='0'>
|
|
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
|
|
+ </controller>
|
|
+ <controller type='pci' index='0' model='pci-root'/>
|
|
+ <interface type='hostdev' managed='yes'>
|
|
+ <mac address='00:11:22:33:44:55'/>
|
|
+ <source>
|
|
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x07' function='0x1'/>
|
|
+ </source>
|
|
+ <boot order='1'/>
|
|
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
|
+ </interface>
|
|
+ <input type='mouse' bus='ps2'/>
|
|
+ <input type='keyboard' bus='ps2'/>
|
|
+ <memballoon model='none'/>
|
|
+ </devices>
|
|
+</domain>
|
|
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
|
|
index db088fff6b..dbac863239 100644
|
|
--- a/tests/qemuxml2xmltest.c
|
|
+++ b/tests/qemuxml2xmltest.c
|
|
@@ -454,6 +454,7 @@ mymain(void)
|
|
DO_TEST("net-virtio-network-portgroup", NONE);
|
|
DO_TEST("net-virtio-rxtxqueuesize", NONE);
|
|
DO_TEST("net-hostdev", NONE);
|
|
+ DO_TEST("net-hostdev-bootorder", NONE);
|
|
DO_TEST("net-hostdev-vfio", NONE);
|
|
DO_TEST("net-midonet", NONE);
|
|
DO_TEST("net-openvswitch", NONE);
|
|
--
|
|
2.20.1
|
|
|