[libvirt] [PATCH v2 2/2] qemu: Implement support for locking domain's memory pages
Laine Stump
laine at laine.org
Fri May 17 00:21:52 UTC 2013
On 05/16/2013 05:23 PM, Jiri Denemark wrote:
> ---
> src/qemu/qemu_capabilities.c | 2 ++
> src/qemu/qemu_capabilities.h | 1 +
> src/qemu/qemu_command.c | 11 +++++++++++
> tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args | 4 ++++
> tests/qemuxml2argvdata/qemuxml2argv-mlock-off.xml | 15 +++++++++++++++
> tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args | 4 ++++
> tests/qemuxml2argvdata/qemuxml2argv-mlock-on.xml | 18 ++++++++++++++++++
> .../qemuxml2argv-mlock-unsupported.args | 4 ++++
> .../qemuxml2argv-mlock-unsupported.xml | 15 +++++++++++++++
> tests/qemuxml2argvtest.c | 5 +++++
> 10 files changed, 79 insertions(+)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mlock-off.xml
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mlock-on.xml
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.args
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.xml
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 488cbfe..82129a2 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -230,6 +230,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
> "mem-merge",
> "vnc-websocket",
> "drive-discard",
> + "mlock",
> );
>
> struct _virQEMUCaps {
> @@ -2246,6 +2247,7 @@ struct virQEMUCapsCommandLineProps {
> static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = {
> { "machine", "mem-merge", QEMU_CAPS_MEM_MERGE },
> { "drive", "discard", QEMU_CAPS_DRIVE_DISCARD },
> + { "realtime", "mlock", QEMU_CAPS_MLOCK },
> };
>
> static int
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index 173ca77..117bf8a 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -187,6 +187,7 @@ enum virQEMUCapsFlags {
> QEMU_CAPS_MEM_MERGE = 146, /* -machine mem-merge */
> QEMU_CAPS_VNC_WEBSOCKET = 147, /* -vnc x:y,websocket */
> QEMU_CAPS_DRIVE_DISCARD = 148, /* -drive discard=off(ignore)|on(unmap) */
> + QEMU_CAPS_MLOCK = 149, /* -realtime mlock=on|off */
>
> 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 5b95c07..c268a3a 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -6541,6 +6541,17 @@ qemuBuildCommandLine(virConnectPtr conn,
> cfg->hugepagePath, NULL);
> }
>
> + if (def->mem.locked && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_MLOCK)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("memory locking not supported by QEMU binary"));
> + goto error;
> + }
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MLOCK)) {
> + virCommandAddArg(cmd, "-realtime");
> + virCommandAddArgFormat(cmd, "mlock=%s",
> + def->mem.locked ? "on" : "off");
> + }
> +
If this is going to lock all of the guests memory in RAM, doesn't
libvirt need to increase RLIMIT_MEMLOCK for the qemu process? (I
recently added virCommandSetMaxMemLock(), which will do that if you need
it).
> virCommandAddArg(cmd, "-smp");
> if (!(smp = qemuBuildSmpArgStr(def, qemuCaps)))
> goto error;
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args b/tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args
> new file mode 100644
> index 0000000..2a5d94c
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-mlock-off.args
> @@ -0,0 +1,4 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \
> +/usr/bin/qemu -S -M pc -m 214 -realtime mlock=off \
> +-smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
> +-no-acpi -boot c -usb -net none -serial none -parallel none
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mlock-off.xml b/tests/qemuxml2argvdata/qemuxml2argv-mlock-off.xml
> new file mode 100644
> index 0000000..4125ca5
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-mlock-off.xml
> @@ -0,0 +1,15 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <devices>
> + <emulator>/usr/bin/qemu</emulator>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args b/tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args
> new file mode 100644
> index 0000000..bb6de13
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-mlock-on.args
> @@ -0,0 +1,4 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \
> +/usr/bin/qemu -S -M pc -m 214 -realtime mlock=on \
> +-smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
> +-no-acpi -boot c -usb -net none -serial none -parallel none
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mlock-on.xml b/tests/qemuxml2argvdata/qemuxml2argv-mlock-on.xml
> new file mode 100644
> index 0000000..20a5eaa
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-mlock-on.xml
> @@ -0,0 +1,18 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <memoryBacking>
> + <locked/>
> + </memoryBacking>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <devices>
> + <emulator>/usr/bin/qemu</emulator>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.args b/tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.args
> new file mode 100644
> index 0000000..54dd3b9
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.args
> @@ -0,0 +1,4 @@
> +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \
> +/usr/bin/qemu -S -M pc -m 214 \
> +-smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \
> +-no-acpi -boot c -usb -net none -serial none -parallel none
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.xml b/tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.xml
> new file mode 100644
> index 0000000..4125ca5
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-mlock-unsupported.xml
> @@ -0,0 +1,15 @@
> +<domain type='qemu'>
> + <name>QEMUGuest1</name>
> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> + <memory unit='KiB'>219136</memory>
> + <currentMemory unit='KiB'>219136</currentMemory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='i686' machine='pc'>hvm</type>
> + <boot dev='hd'/>
> + </os>
> + <devices>
> + <emulator>/usr/bin/qemu</emulator>
> + <memballoon model='none'/>
> + </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index c751440..d853308 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -1007,6 +1007,11 @@ mymain(void)
> QEMU_CAPS_DEVICE_SCSI_GENERIC,
> QEMU_CAPS_DEVICE_SCSI_GENERIC_BOOTINDEX);
>
> + DO_TEST("mlock-on", QEMU_CAPS_MLOCK);
> + DO_TEST_FAILURE("mlock-on", NONE);
> + DO_TEST("mlock-off", QEMU_CAPS_MLOCK);
> + DO_TEST("mlock-unsupported", NONE);
> +
> virObjectUnref(driver.config);
> virObjectUnref(driver.caps);
> virObjectUnref(driver.xmlopt);
More information about the libvir-list
mailing list