From 77b54b96611655355936f8024fad588af16610a1 Mon Sep 17 00:00:00 2001 From: Osier Yang Date: Tue, 14 May 2013 13:25:50 +0800 Subject: [PATCH] qemu: New XML to disable memory merge at guest startup QEMU introduced command line "-mem-merge=on|off" (defaults to on) to enable/disable the memory merge (KSM) at guest startup. This exposes it by new XML: The XML tag is same with what we used internally for old RHEL. --- docs/formatdomain.html.in | 14 ++++++--- docs/schemas/domaincommon.rng | 17 +++++++--- src/conf/domain_conf.c | 20 ++++++++---- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 22 +++++++++++++ tests/qemuargv2xmltest.c | 2 ++ .../qemuxml2argv-nosharepages.args | 4 +++ .../qemuxml2argv-nosharepages.xml | 31 +++++++++++++++++++ tests/qemuxml2argvtest.c | 1 + tests/qemuxml2xmltest.c | 1 + 10 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-nosharepages.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-nosharepages.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 9ade5072bd..df772b5322 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -561,6 +561,7 @@ ... <memoryBacking> <hugepages/> + <nosharepages/> </memoryBacking> ... </domain> @@ -568,10 +569,15 @@
memoryBacking
-
The optional memoryBacking element, may have an - hugepages element set within it. This tells the - hypervisor that the guest should have its memory allocated using - hugepages instead of the normal native page size.
+
The optional memoryBacking element has two + optional elements. The element hugepages tells + the hypervisor that the guest should have its memory allocated + using hugepages instead of the normal native page size. And the + optional element nosharepages + (since 1.0.6) tells the hypervisor + that share pages (memory merge, KSM) should be disabled on guest + startup. +
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 800442896e..b40cb9008d 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -490,11 +490,18 @@ - - - - - + + + + + + + + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 862b9970cb..2ab1bf8266 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10306,6 +10306,9 @@ virDomainDefParseXML(xmlDocPtr xml, if ((node = virXPathNode("./memoryBacking/hugepages", ctxt))) def->mem.hugepage_backed = true; + if ((node = virXPathNode("./memoryBacking/nosharepages", ctxt))) + def->mem.nosharepages = true; + /* Extract blkio cgroup tunables */ if (virXPathUInt("string(./blkiotune/weight)", ctxt, &def->blkio.weight) < 0) @@ -15662,12 +15665,17 @@ virDomainDefFormatInternal(virDomainDefPtr def, def->mem.swap_hard_limit) virBufferAddLit(buf, " \n"); - if (def->mem.hugepage_backed) { - virBufferStrcat(buf, - " \n", - " \n", - " \n", NULL); - } + if (def->mem.hugepage_backed || def->mem.nosharepages) + virBufferAddLit(buf, " \n"); + + if (def->mem.hugepage_backed) + virBufferAddLit(buf, " \n"); + + if (def->mem.nosharepages) + virBufferAddLit(buf, " \n"); + + if (def->mem.hugepage_backed || def->mem.nosharepages) + virBufferAddLit(buf, " \n"); virBufferAddLit(buf, " mem.nosharepages) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disable shared memory is not available " + "with this QEMU binary")); + return -1; + } + obsoleteAccel = true; } else { virBuffer buf = VIR_BUFFER_INITIALIZER; @@ -5878,6 +5886,18 @@ qemuBuildMachineArgStr(virCommandPtr cmd, virDomainMemDumpTypeToString(def->mem.dump_core)); } + if (def->mem.nosharepages) { + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MEM_MERGE)) { + virBufferAddLit(&buf, ",mem-merge=off"); + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disable shared memory is not available " + "with this QEMU binary")); + virBufferFreeAndReset(&buf); + return -1; + } + } + virCommandAddArgBuffer(cmd, &buf); } @@ -10183,6 +10203,8 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps, def->mem.dump_core = VIR_DOMAIN_MEM_DUMP_DEFAULT; if (params) VIR_FREE(tmp); + } else if (STRPREFIX(tmp, "mem-merge=off")) { + def->mem.nosharepages = true; } } } diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 005aa0cfe8..528b8bf65f 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -246,6 +246,8 @@ mymain(void) DO_TEST("pseries-nvram"); + DO_TEST("nosharepages"); + DO_TEST_FULL("restore-v1", 0, "stdio"); DO_TEST_FULL("restore-v2", 0, "stdio"); DO_TEST_FULL("restore-v2", 0, "exec:cat"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-nosharepages.args b/tests/qemuxml2argvdata/qemuxml2argv-nosharepages.args new file mode 100644 index 0000000000..a32dfe5cf9 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-nosharepages.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu \ +-S -machine pc,accel=tcg,mem-merge=off -m 215 -smp 1 -nographic \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi \ +-boot c -usb -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none diff --git a/tests/qemuxml2argvdata/qemuxml2argv-nosharepages.xml b/tests/qemuxml2argvdata/qemuxml2argv-nosharepages.xml new file mode 100644 index 0000000000..5e54cd0aa9 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-nosharepages.xml @@ -0,0 +1,31 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219200 + 219200 + + + + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index a373ed3ba1..a2226f8dcf 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -439,6 +439,7 @@ mymain(void) DO_TEST("hyperv", NONE); DO_TEST("hugepages", QEMU_CAPS_MEM_PATH); + DO_TEST("nosharepages", QEMU_CAPS_MACHINE_OPT, QEMU_CAPS_MEM_MERGE); DO_TEST("disk-cdrom", NONE); DO_TEST("disk-cdrom-empty", QEMU_CAPS_DRIVE); DO_TEST("disk-cdrom-tray", diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 492ac60102..ddf3230d38 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -158,6 +158,7 @@ mymain(void) DO_TEST("hyperv"); DO_TEST("hugepages"); + DO_TEST("nosharepages"); DO_TEST("disk-aio"); DO_TEST("disk-cdrom"); DO_TEST("disk-floppy");