From fbf9aa12c7e5ade035f208584b3a55401bc097a3 Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Thu, 13 Sep 2012 15:27:07 +0200 Subject: [PATCH] qemu: Add support for EOI with APIC 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 +++ .../qemuxml2argv-eoi-disabled.xml | 25 +++++++++++++++++ .../qemuxml2argv-eoi-enabled.args | 4 +++ .../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 0582d2949a..ec825bcad2 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4234,6 +4234,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; @@ -7691,6 +7703,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 0000000000..6d57f91013 --- /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 0000000000..467df30417 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-disabled.xml @@ -0,0 +1,28 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 6 + + hvm + + + + + + + + + qemu32 + + + destroy + restart + destroy + + /./qemu.sh + + + + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.args new file mode 100644 index 0000000000..3dc43107ce --- /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 0000000000..1ed630a0c7 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-eoi-enabled.xml @@ -0,0 +1,28 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 6 + + hvm + + + + + + + + + qemu32 + + + destroy + restart + destroy + + /./qemu.sh + + + + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.args new file mode 100644 index 0000000000..93475bd0e6 --- /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 0000000000..f84570e70e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-disabled.xml @@ -0,0 +1,25 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 6 + + hvm + + + + + + + + + destroy + restart + destroy + + /./qemu.sh + + + + diff --git a/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.args new file mode 100644 index 0000000000..13f570be49 --- /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 0000000000..03b6b52e76 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-eoi-enabled.xml @@ -0,0 +1,25 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 6 + + hvm + + + + + + + + + destroy + restart + destroy + + /./qemu.sh + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 936b749016..468014c759 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 87d9e7790d..0a6da984bc 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");