[libvirt] [PATCH v3 3/3] qemu: Automatically add <panic> element for pSeries guests.

Andrea Bolognani abologna at redhat.com
Thu May 28 14:39:13 UTC 2015


The guest firmware provides the same functionality as the pvpanic
device, and the relevant element should always be present in the
domain XML to reflect this fact, so add it after parsing the
definition if it wasn't there already.
---
 docs/formatdomain.html.in                          |  5 ++++
 src/qemu/qemu_domain.c                             | 14 ++++++++++
 .../qemuxml2argvdata/qemuxml2argv-pseries-disk.xml |  1 +
 .../qemuxml2argv-pseries-nvram.xml                 |  1 +
 .../qemuxml2argv-pseries-panic-missing.args        |  7 +++++
 .../qemuxml2argv-pseries-panic-missing.xml         | 29 +++++++++++++++++++++
 tests/qemuxml2argvtest.c                           |  2 ++
 .../qemuxml2xmlout-pseries-panic-missing.xml       | 30 ++++++++++++++++++++++
 tests/qemuxml2xmltest.c                            |  1 +
 9 files changed, 90 insertions(+)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.xml
 create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 7dd5fa9..bffa412 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -5944,6 +5944,11 @@ qemu-kvm -net nic,model=? /dev/null
       <span class="since">Since 1.2.1, QEMU and KVM only</span>
     </p>
     <p>
+      For pSeries guests, this feature is always enabled because it's
+      implemented by the guest firmware. libvirt will automatically add the
+      <code>panic</code> element to the domain XML to reflect this fact.
+    </p>
+    <p>
       Example: usage of panic configuration
     </p>
 <pre>
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index db8554b..12a1d97 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -959,6 +959,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
     bool addDefaultMemballoon = true;
     bool addDefaultUSBKBD = false;
     bool addDefaultUSBMouse = false;
+    bool addPanicDevice = false;
 
     if (def->os.bootloader || def->os.bootloaderArgs) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -1011,6 +1012,11 @@ qemuDomainDefPostParse(virDomainDefPtr def,
         addPCIRoot = true;
         addDefaultUSBKBD = true;
         addDefaultUSBMouse = true;
+        /* For pSeries guests, the firmware provides the same
+         * functionality as the pvpanic device, so automatically
+         * add the definition if not already present */
+        if (STRPREFIX(def->os.machine, "pseries"))
+            addPanicDevice = true;
         break;
 
     case VIR_ARCH_ALPHA:
@@ -1093,6 +1099,14 @@ qemuDomainDefPostParse(virDomainDefPtr def,
                                   VIR_DOMAIN_INPUT_BUS_USB) < 0)
         return -1;
 
+    if (addPanicDevice && !def->panic) {
+        virDomainPanicDefPtr panic;
+        if (VIR_ALLOC(panic) < 0)
+            return -1;
+
+        def->panic = panic;
+    }
+
     return 0;
 }
 
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
index d9ae4af..3a96209 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-disk.xml
@@ -37,5 +37,6 @@
       <model type='cirrus' vram='16384' heads='1'/>
     </video>
     <memballoon model='none'/>
+    <panic/>
   </devices>
 </domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
index 9703bd4..619186a 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-nvram.xml
@@ -20,5 +20,6 @@
     <nvram>
       <address type='spapr-vio' reg='0x4000'/>
     </nvram>
+    <panic/>
   </devices>
 </domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args
new file mode 100644
index 0000000..30e4b43
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.args
@@ -0,0 +1,7 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-ppc64 -S -M pseries -m 512 -smp 1 -nographic \
+-nodefconfig -nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/test-monitor,server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c -usb \
+-chardev pty,id=charserial0 \
+-device spapr-vty,chardev=charserial0,reg=0x30000000
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.xml b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.xml
new file mode 100644
index 0000000..8980847
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pseries-panic-missing.xml
@@ -0,0 +1,29 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+  <memory unit='KiB'>524288</memory>
+  <currentMemory unit='KiB'>524288</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='ppc64' machine='pseries'>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/bin/qemu-system-ppc64</emulator>
+    <controller type='usb' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <serial type='pty'>
+      <target port='0'/>
+      <address type='spapr-vio'/>
+    </serial>
+    <console type='pty'>
+      <target type='serial' port='0'/>
+      <address type='spapr-vio'/>
+    </console>
+    <memballoon model='none'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index f822670..11e09ce 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -1365,6 +1365,8 @@ mymain(void)
             QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
     DO_TEST("pseries-cpu-le",  QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST,
             QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
+    DO_TEST("pseries-panic-missing",
+            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
     DO_TEST("pseries-panic-no-address",
             QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
     DO_TEST_FAILURE("pseries-panic-address",
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
new file mode 100644
index 0000000..9312975
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-pseries-panic-missing.xml
@@ -0,0 +1,30 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+  <memory unit='KiB'>524288</memory>
+  <currentMemory unit='KiB'>524288</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='ppc64' machine='pseries'>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/bin/qemu-system-ppc64</emulator>
+    <controller type='usb' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <serial type='pty'>
+      <target port='0'/>
+      <address type='spapr-vio'/>
+    </serial>
+    <console type='pty'>
+      <target type='serial' port='0'/>
+      <address type='spapr-vio'/>
+    </console>
+    <memballoon model='none'/>
+    <panic/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index c147795..4cc1b6a 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -537,6 +537,7 @@ mymain(void)
     DO_TEST("virtio-rng-egd");
 
     DO_TEST("pseries-nvram");
+    DO_TEST_DIFFERENT("pseries-panic-missing");
     DO_TEST("pseries-panic-no-address");
 
     /* These tests generate different XML */
-- 
2.1.0




More information about the libvir-list mailing list