File libvirt-Disable-KSM-on-domain-startup.patch of Package libvirt
From 89e0e17d29d45184209c433a10b5f48c3594b0f7 Mon Sep 17 00:00:00 2001
From: Osier Yang <jyang@redhat.com>
Date: Tue, 1 Feb 2011 15:45:35 +0800
Subject: [PATCH] Disable KSM on domain startup
To: libvir-list@redhat.com
RHEL-6 only, uses -redhat-disable-ksm qemu option
NOTE:
This patch is based on patches by Andrea Arcangeli(aarcange@redhat com),
(Message-Id: <20101228113546 GT21490 random random>).
BZ# 635419
https://bugzilla.redhat.com/show_bug.cgi?id=635419
Conflicts:
src/conf/domain_conf.h: context changes
src/qemu/qemu_capabilities.c: context changes
tests/qemuhelptest.c: context changes
Signed-off-by: Daniel Veillard <veillard@redhat.com>
---
docs/formatdomain.html.in | 11 ++++++++-
docs/schemas/domaincommon.rng | 5 ++++
src/conf/domain_conf.c | 21 +++++++++++-----
src/conf/domain_conf.h | 1 +
src/qemu/qemu_capabilities.c | 4 ++++
src/qemu/qemu_capabilities.h | 2 ++
src/qemu/qemu_command.c | 11 +++++++++
tests/qemuhelptest.c | 6 +++--
.../qemuxml2argvdata/qemuxml2argv-disable-ksm.args | 2 ++
.../qemuxml2argvdata/qemuxml2argv-disable-ksm.xml | 28 ++++++++++++++++++++++
10 files changed, 82 insertions(+), 9 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index bc4cc4a..8a7f873 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -551,7 +551,16 @@
<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>
+ hugepages instead of the normal native page size. The optional
+ <code>nosharepages</code> element tells the hypervisor that
+ share pages (KSM) should be disabled on guest startup</dd>
+ <dt><code>blkiotune</code></dt>
+ <dd> The optional <code>blkiotune</code> element provides the ability
+ to tune Blkio cgroup tunable parameters for the domain. If this is
+ omitted, it defaults to the OS provided defaults.</dd>
+ <dt><code>weight</code></dt>
+ <dd> The optional <code>weight</code> element is the I/O weight of the
+ guest. The value should be in range [100, 1000].</dd>
</dl>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index f47fdad..45bb67c 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -491,6 +491,11 @@
<empty/>
</element>
</optional>
+ <optional>
+ <element name="nosharepages">
+ <empty/>
+ </element>
+ </optional>
</element>
</optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4aa08d0..af02f4a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8606,6 +8606,10 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
if (node)
def->mem.hugepage_backed = true;
+ node = virXPathNode("./memoryBacking/nosharepages", ctxt);
+ if (node)
+ def->mem.ksm_disabled = 1;
+
/* Extract blkio cgroup tunables */
if (virXPathUInt("string(./blkiotune/weight)", ctxt,
&def->blkio.weight) < 0)
@@ -13412,12 +13416,17 @@ virDomainDefFormatInternal(virDomainDefPtr def,
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.ksm_disabled)
+ virBufferAddLit(buf, " <memoryBacking>\n");
+
+ if (def->mem.hugepage_backed)
+ virBufferAddLit(buf, " <hugepages/>\n");
+
+ if (def->mem.ksm_disabled)
+ virBufferAddLit(buf, " <nosharepages/>\n");
+
+ if (def->mem.hugepage_backed || def->mem.ksm_disabled)
+ virBufferAddLit(buf, " </memoryBacking>\n");
virBufferAddLit(buf, " <vcpu");
virBufferAsprintf(buf, " placement='%s'",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 1a61318..7a7ffca 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1652,6 +1652,7 @@ struct _virDomainDef {
unsigned long long max_balloon; /* in kibibytes */
unsigned long long cur_balloon; /* in kibibytes */
bool hugepage_backed;
+ unsigned long ksm_disabled;
int dump_core; /* enum virDomainMemDump */
unsigned long long hard_limit; /* in kibibytes */
unsigned long long soft_limit; /* in kibibytes */
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 3b08ef8..1869fea 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -183,6 +183,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
"reboot-timeout", /* 110 */
"dump-guest-core",
+ "disable-ksm", /* 112 */
);
struct _qemuCaps {
@@ -1227,6 +1228,9 @@ qemuCapsComputeCmdFlags(const char *help,
strstr(help, "sockets="))
qemuCapsSet(caps, QEMU_CAPS_SMP_TOPOLOGY);
+ if (strstr(help, "-redhat-disable-KSM"))
+ qemuCapsSet(caps, QEMU_CAPS_DISABLE_KSM);
+
if (version >= 9000)
qemuCapsSet(caps, QEMU_CAPS_VNC_COLON);
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 485c297..a16a3c4 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -148,6 +148,8 @@ enum qemuCapsFlags {
QEMU_CAPS_REBOOT_TIMEOUT = 110, /* -boot reboot-timeout */
QEMU_CAPS_DUMP_GUEST_CORE = 111, /* dump-guest-core-parameter */
+ QEMU_CAPS_DISABLE_KSM , /* Is '-redhat-disable-KSM' available? */
+
QEMU_CAPS_LAST, /* this must always be the last item */
};
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index e7bb88e..8431f65 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4595,6 +4595,17 @@ qemuBuildCommandLine(virConnectPtr conn,
driver->hugepage_path, NULL);
}
+ if (def->mem.ksm_disabled) {
+ if (!qemuCapsGet(caps, QEMU_CAPS_DISABLE_KSM)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("'-redhat-disable-KSM' is not supported by '%s'"),
+ def->emulator);
+ goto error;
+ }
+
+ virCommandAddArg(cmd, "-redhat-disable-KSM");
+ }
+
virCommandAddArg(cmd, "-smp");
if (!(smp = qemuBuildSmpArgStr(def, caps)))
goto error;
diff --git a/tests/qemuhelptest.c b/tests/qemuhelptest.c
index 079aef8..a3cdc96 100644
--- a/tests/qemuhelptest.c
+++ b/tests/qemuhelptest.c
@@ -541,7 +541,8 @@ mymain(void)
QEMU_CAPS_VIRTIO_BLK_SCSI,
QEMU_CAPS_VIRTIO_BLK_SG_IO,
QEMU_CAPS_CPU_HOST,
- QEMU_CAPS_BLOCKIO);
+ QEMU_CAPS_BLOCKIO,
+ QEMU_CAPS_DISABLE_KSM);
DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0,
QEMU_CAPS_VNC_COLON,
QEMU_CAPS_NO_REBOOT,
@@ -609,7 +610,8 @@ mymain(void)
QEMU_CAPS_DRIVE_COPY_ON_READ,
QEMU_CAPS_CPU_HOST,
QEMU_CAPS_SCSI_CD,
- QEMU_CAPS_BLOCKIO);
+ QEMU_CAPS_BLOCKIO,
+ QEMU_CAPS_DISABLE_KSM);
DO_TEST("qemu-1.0", 1000000, 0, 0,
QEMU_CAPS_VNC_COLON,
QEMU_CAPS_NO_REBOOT,
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.args b/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.args
new file mode 100644
index 0000000..a9715d3
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.args
@@ -0,0 +1,2 @@
++LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -redhat-disable-KSM -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
+diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.xml b/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.xml
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.xml b/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.xml
new file mode 100644
index 0000000..3c7bbbe
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disable-ksm.xml
@@ -0,0 +1,28 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory>219200</memory>
+ <currentMemory>219200</currentMemory>
+ <memoryBacking>
+ <nosharepages/>
+ </memoryBacking>
+ <vcpu>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'>
+ <source dev='/dev/HostVG/QEMUGuest1'/>
+ <target dev='hda' bus='ide'/>
+ <address type='drive' controller='0' bus='0' unit='0'/>
+ </disk>
+ <controller type='ide' index='0'/>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
--
1.7.11.4