[libvirt] [PATCH 2/2] qemu: Add support for EOI with APIC

Martin Kletzander mkletzan at redhat.com
Thu Sep 13 14:12:02 UTC 2012


This patch adds full support for EOI setting for domains. Because this
is CPU feature (flag), the model needs to be added even when it's not
specified. Fortunately this problem was already solved with kvmclock,
so this patch simply abuses that.

And due to the size of the patch (17 lines) I dared to include the tests.
---
 src/qemu/qemu_command.c                            | 17 +++++++++++++
 .../qemuxml2argv-cpu-eoi-disabled.args             |  4 ++++
 .../qemuxml2argv-cpu-eoi-disabled.xml              | 28 ++++++++++++++++++++++
 .../qemuxml2argv-cpu-eoi-enabled.args              |  4 ++++
 .../qemuxml2argv-cpu-eoi-enabled.xml               | 28 ++++++++++++++++++++++
 .../qemuxml2argv-eoi-disabled.args                 |  4 ++++
 .../qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml | 25 +++++++++++++++++++
 .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.args |  4 ++++
 .../qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml  | 25 +++++++++++++++++++
 tests/qemuxml2argvtest.c                           |  5 ++++
 tests/qemuxml2xmltest.c                            |  6 +++++
 11 files changed, 150 insertions(+)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index cd4ee93..4aed8f6 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4193,6 +4193,18 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
         }
     }

+    if (def->apic_eoi) {
+        char sign;
+        if (def->apic_eoi == VIR_DOMAIN_APIC_EOI_ON)
+            sign = '+';
+        else
+            sign = '-';
+
+        virBufferAsprintf(&buf, "%s,%ckvm_pv_eoi",
+                          have_cpu ? "" : default_model,
+                          sign);
+    }
+
     if (virBufferError(&buf))
         goto no_memory;

@@ -7650,6 +7662,11 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
                 }
                 dom->clock.timers[i]->present = present;
                 ret = 0;
+            } else if (STREQ(feature, "kvm_pv_eoi")) {
+                if (policy == VIR_CPU_FEATURE_REQUIRE)
+                    dom->apic_eoi = VIR_DOMAIN_APIC_EOI_ON;
+                else
+                    dom->apic_eoi = VIR_DOMAIN_APIC_EOI_OFF;
             } else {
                 if (!cpu) {
                     if (!(cpu = qemuInitGuestCPU(dom)))
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.args
new file mode 100644
index 0000000..6d57f91
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.args
@@ -0,0 +1,4 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test ./qemu.sh -S -M pc \
+-cpu qemu32,-kvm_pv_eoi -m 214 -smp 6 -nographic -monitor \
+unix:/tmp/test-monitor,server,nowait -boot n -net none -serial none \
+-parallel none -usb
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml
new file mode 100644
index 0000000..467df30
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml
@@ -0,0 +1,28 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>6</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='network'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic eoi='off'/>
+    <pae/>
+  </features>
+  <cpu mode='custom' match='exact'>
+    <model fallback='allow'>qemu32</model>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/./qemu.sh</emulator>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args
new file mode 100644
index 0000000..3dc4310
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args
@@ -0,0 +1,4 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test ./qemu.sh -S -M pc \
+-cpu qemu32,+kvm_pv_eoi -m 214 -smp 6 -nographic -monitor \
+unix:/tmp/test-monitor,server,nowait -boot n -net none -serial none \
+-parallel none -usb
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml
new file mode 100644
index 0000000..1ed630a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml
@@ -0,0 +1,28 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>6</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='network'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic eoi='on'/>
+    <pae/>
+  </features>
+  <cpu mode='custom' match='exact'>
+    <model fallback='allow'>qemu32</model>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/./qemu.sh</emulator>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args
new file mode 100644
index 0000000..93475bd
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args
@@ -0,0 +1,4 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test ./qemu.sh -S -M pc \
+-cpu qemu32,-kvm_pv_eoi -m 214 -smp 6 -nographic -monitor \
+unix:/tmp/test-monitor,server,nowait -boot n -net none -serial \
+none -parallel none -usb
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml
new file mode 100644
index 0000000..f84570e
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml
@@ -0,0 +1,25 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>6</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='network'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic eoi='off'/>
+    <pae/>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/./qemu.sh</emulator>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args
new file mode 100644
index 0000000..13f570b
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args
@@ -0,0 +1,4 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test ./qemu.sh -S -M pc \
+-cpu qemu32,+kvm_pv_eoi -m 214 -smp 6 -nographic -monitor \
+unix:/tmp/test-monitor,server,nowait -boot n -net none -serial \
+none -parallel none -usb
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml
new file mode 100644
index 0000000..03b6b52
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml
@@ -0,0 +1,25 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>6</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='network'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic eoi='on'/>
+    <pae/>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/./qemu.sh</emulator>
+    <controller type='usb' index='0'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 47c3f6c..f0478b1 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -385,6 +385,11 @@ mymain(void)
     DO_TEST("cpu-host-kvmclock", QEMU_CAPS_ENABLE_KVM, QEMU_CAPS_CPU_HOST);
     DO_TEST("kvmclock", QEMU_CAPS_KVM);

+    DO_TEST("cpu-eoi-disabled", QEMU_CAPS_ENABLE_KVM);
+    DO_TEST("cpu-eoi-enabled", QEMU_CAPS_ENABLE_KVM);
+    DO_TEST("eoi-disabled", NONE);
+    DO_TEST("eoi-enabled", NONE);
+
     DO_TEST("hugepages", QEMU_CAPS_MEM_PATH);
     DO_TEST("disk-cdrom", NONE);
     DO_TEST("disk-cdrom-empty", QEMU_CAPS_DRIVE);
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 87d9e77..0a6da98 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -138,6 +138,12 @@ mymain(void)
     DO_TEST("cpu-kvmclock");
     DO_TEST("cpu-host-kvmclock");
     DO_TEST("kvmclock");
+
+    DO_TEST("cpu-eoi-disabled");
+    DO_TEST("cpu-eoi-enabled");
+    DO_TEST("eoi-disabled");
+    DO_TEST("eoi-enabled");
+
     DO_TEST("hugepages");
     DO_TEST("disk-aio");
     DO_TEST("disk-cdrom");
-- 
1.7.12




More information about the libvir-list mailing list