...
<memoryBacking>
<hugepages/>
+ <nosharepages/>
</memoryBacking>
...
</domain>
<dl>
<dt><code>memoryBacking</code></dt>
- <dd>The optional <code>memoryBacking</code> element, may have an
- <code>hugepages</code> 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.</dd>
+ <dd>The optional <code>memoryBacking</code> element has two
+ optional elements. The element <code>hugepages</code> tells
+ the hypervisor that the guest should have its memory allocated
+ using hugepages instead of the normal native page size. And the
+ optional element <code>nosharepages</code>
+ (<span class="since">since 1.0.6</span>) tells the hypervisor
+ that share pages (memory merge, KSM) should be disabled on guest
+ startup.
+ </dd>
</dl>
</optional>
<optional>
<element name="memoryBacking">
- <optional>
- <element name="hugepages">
- <empty/>
- </element>
- </optional>
+ <interleave>
+ <optional>
+ <element name="hugepages">
+ <empty/>
+ </element>
+ </optional>
+ <optional>
+ <element name="nosharepages">
+ <empty/>
+ </element>
+ </optional>
+ </interleave>
</element>
</optional>
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)
def->mem.swap_hard_limit)
virBufferAddLit(buf, " </memtune>\n");
- if (def->mem.hugepage_backed) {
- virBufferStrcat(buf,
- " <memoryBacking>\n",
- " <hugepages/>\n",
- " </memoryBacking>\n", NULL);
- }
+ if (def->mem.hugepage_backed || def->mem.nosharepages)
+ virBufferAddLit(buf, " <memoryBacking>\n");
+
+ if (def->mem.hugepage_backed)
+ virBufferAddLit(buf, " <hugepages/>\n");
+
+ if (def->mem.nosharepages)
+ virBufferAddLit(buf, " <nosharepages/>\n");
+
+ if (def->mem.hugepage_backed || def->mem.nosharepages)
+ virBufferAddLit(buf, " </memoryBacking>\n");
virBufferAddLit(buf, " <vcpu");
virBufferAsprintf(buf, " placement='%s'",
unsigned long long max_balloon; /* in kibibytes */
unsigned long long cur_balloon; /* in kibibytes */
bool hugepage_backed;
+ bool nosharepages;
int dump_core; /* enum virDomainMemDump */
unsigned long long hard_limit; /* in kibibytes */
unsigned long long soft_limit; /* in kibibytes */
"with this QEMU binary"));
return -1;
}
+
+ if (def->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;
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);
}
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;
}
}
}
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");
--- /dev/null
+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
--- /dev/null
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219200</memory>
+ <currentMemory unit='KiB'>219200</currentMemory>
+ <memoryBacking>
+ <nosharepages/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>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</emulator>
+ <disk type='block' device='disk'>
+ <driver name='qemu' type='raw'/>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='ide' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
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",
DO_TEST("hyperv");
DO_TEST("hugepages");
+ DO_TEST("nosharepages");
DO_TEST("disk-aio");
DO_TEST("disk-cdrom");
DO_TEST("disk-floppy");