These tests cover a number of scenarios where we care about
the memory locking limit being set correctly for the guest
to work properly.
---
tests/Makefile.am | 9 ++
.../qemumemlock-pc-hardlimit+hostdev.xml | 20 +++
.../qemumemlock-pc-hardlimit+locked+hostdev.xml | 23 +++
.../qemumemlock-pc-hardlimit+locked.xml | 17 ++
tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml | 14 ++
tests/qemumemlockdata/qemumemlock-pc-hostdev.xml | 17 ++
tests/qemumemlockdata/qemumemlock-pc-kvm.xml | 11 ++
.../qemumemlock-pc-locked+hostdev.xml | 20 +++
tests/qemumemlockdata/qemumemlock-pc-locked.xml | 14 ++
tests/qemumemlockdata/qemumemlock-pc-tcg.xml | 11 ++
.../qemumemlock-pseries-hardlimit+hostdev.xml | 20 +++
...emumemlock-pseries-hardlimit+locked+hostdev.xml | 23 +++
.../qemumemlock-pseries-hardlimit+locked.xml | 17 ++
.../qemumemlock-pseries-hardlimit.xml | 14 ++
.../qemumemlock-pseries-hostdev.xml | 17 ++
tests/qemumemlockdata/qemumemlock-pseries-kvm.xml | 11 ++
.../qemumemlock-pseries-locked+hostdev.xml | 20 +++
.../qemumemlockdata/qemumemlock-pseries-locked.xml | 14 ++
tests/qemumemlockdata/qemumemlock-pseries-tcg.xml | 11 ++
tests/qemumemlocktest.c | 172 +++++++++++++++++++++
20 files changed, 475 insertions(+)
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit+hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked+hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-kvm.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-locked+hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-locked.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pc-tcg.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit+hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked+hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-kvm.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-locked+hostdev.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-locked.xml
create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-tcg.xml
create mode 100644 tests/qemumemlocktest.c
diff --git a/tests/Makefile.am b/tests/Makefile.am
index af69a3a..ccf5ee1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -127,6 +127,7 @@ EXTRA_DIST = \
qemumonitorjsondata \
qemuxml2argvdata \
qemuxml2xmloutdata \
+ qemumemlockdata \
secretxml2xmlin \
securityselinuxhelperdata \
securityselinuxlabeldata \
@@ -276,6 +277,7 @@ test_programs += qemuxml2argvtest qemuxml2xmltest \
qemuargv2xmltest qemuhelptest domainsnapshotxml2xmltest \
qemumonitortest qemumonitorjsontest qemuhotplugtest \
qemuagenttest qemucapabilitiestest qemucaps2xmltest \
+ qemumemlocktest \
qemucommandutiltest
test_helpers += qemucapsprobe
test_libraries += libqemumonitortestutils.la \
@@ -658,6 +660,12 @@ domainsnapshotxml2xmltest_SOURCES = \
domainsnapshotxml2xmltest.c testutilsqemu.c testutilsqemu.h \
testutils.c testutils.h
domainsnapshotxml2xmltest_LDADD = $(qemu_LDADDS) $(LDADDS)
+
+qemumemlocktest_SOURCES = \
+ qemumemlocktest.c \
+ testutilsqemu.c testutilsqemu.h \
+ testutils.c testutils.h
+qemumemlocktest_LDADD = $(qemu_LDADDS) $(LDADDS)
else ! WITH_QEMU
EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c \
qemuhelptest.c domainsnapshotxml2xmltest.c \
@@ -665,6 +673,7 @@ EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c \
qemumonitorjsontest.c qemuhotplugtest.c \
qemuagenttest.c qemucapabilitiestest.c \
qemucaps2xmltest.c qemucommandutiltest.c \
+ qemumemlocktest.c \
$(QEMUMONITORTESTUTILS_SOURCES)
endif ! WITH_QEMU
diff --git a/tests/qemumemlockdata/qemumemlock-pc-hardlimit+hostdev.xml b/tests/qemumemlockdata/qemumemlock-pc-hardlimit+hostdev.xml
new file mode 100644
index 0000000..5443145
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-hardlimit+hostdev.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked+hostdev.xml b/tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked+hostdev.xml
new file mode 100644
index 0000000..8184eef
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked+hostdev.xml
@@ -0,0 +1,23 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked.xml b/tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked.xml
new file mode 100644
index 0000000..78bee62
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked.xml
@@ -0,0 +1,17 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml b/tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml
new file mode 100644
index 0000000..b1e3867
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml
@@ -0,0 +1,14 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-hostdev.xml b/tests/qemumemlockdata/qemumemlock-pc-hostdev.xml
new file mode 100644
index 0000000..6c058a9
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-hostdev.xml
@@ -0,0 +1,17 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-kvm.xml b/tests/qemumemlockdata/qemumemlock-pc-kvm.xml
new file mode 100644
index 0000000..7fa4e24
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-kvm.xml
@@ -0,0 +1,11 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-locked+hostdev.xml b/tests/qemumemlockdata/qemumemlock-pc-locked+hostdev.xml
new file mode 100644
index 0000000..fbc1dc3
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-locked+hostdev.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-locked.xml b/tests/qemumemlockdata/qemumemlock-pc-locked.xml
new file mode 100644
index 0000000..febb036
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-locked.xml
@@ -0,0 +1,14 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pc-tcg.xml b/tests/qemumemlockdata/qemumemlock-pc-tcg.xml
new file mode 100644
index 0000000..1934269
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pc-tcg.xml
@@ -0,0 +1,11 @@
+<domain type='qemu'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-x86_64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+hostdev.xml b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+hostdev.xml
new file mode 100644
index 0000000..ddd3b47
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+hostdev.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked+hostdev.xml b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked+hostdev.xml
new file mode 100644
index 0000000..73c28c1
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked+hostdev.xml
@@ -0,0 +1,23 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked.xml b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked.xml
new file mode 100644
index 0000000..fe984a2
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked.xml
@@ -0,0 +1,17 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-hardlimit.xml b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit.xml
new file mode 100644
index 0000000..b23de1d
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-hardlimit.xml
@@ -0,0 +1,14 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memtune>
+ <hard_limit unit='KiB'>2097152</hard_limit>
+ </memtune>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml b/tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml
new file mode 100644
index 0000000..daf70a4
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml
@@ -0,0 +1,17 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-kvm.xml b/tests/qemumemlockdata/qemumemlock-pseries-kvm.xml
new file mode 100644
index 0000000..5a065da
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-kvm.xml
@@ -0,0 +1,11 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-locked+hostdev.xml b/tests/qemumemlockdata/qemumemlock-pseries-locked+hostdev.xml
new file mode 100644
index 0000000..74212f1
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-locked+hostdev.xml
@@ -0,0 +1,20 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ <hostdev mode='subsystem' type='pci' managed='yes'>
+ <driver name='vfio'/>
+ <source>
+ <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
+ </source>
+ </hostdev>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-locked.xml b/tests/qemumemlockdata/qemumemlock-pseries-locked.xml
new file mode 100644
index 0000000..befaefd
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-locked.xml
@@ -0,0 +1,14 @@
+<domain type='kvm'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <memoryBacking>
+ <locked/>
+ </memoryBacking>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlockdata/qemumemlock-pseries-tcg.xml b/tests/qemumemlockdata/qemumemlock-pseries-tcg.xml
new file mode 100644
index 0000000..a3b03dd
--- /dev/null
+++ b/tests/qemumemlockdata/qemumemlock-pseries-tcg.xml
@@ -0,0 +1,11 @@
+<domain type='qemu'>
+ <name>guest</name>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='ppc64' machine='pseries'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-ppc64</emulator>
+ </devices>
+</domain>
diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c
new file mode 100644
index 0000000..9e65622
--- /dev/null
+++ b/tests/qemumemlocktest.c
@@ -0,0 +1,172 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include "testutils.h"
+
+#ifdef WITH_QEMU
+
+# include "datatypes.h"
+# include "internal.h"
+# include "virstring.h"
+# include "conf/domain_conf.h"
+# include "qemu/qemu_capabilities.h"
+# include "qemu/qemu_process.h"
+
+# include "testutilsqemu.h"
+
+# define VIR_FROM_THIS VIR_FROM_QEMU
+
+static const char *abs_top_srcdir;
+static virQEMUDriver driver;
+
+struct testInfo {
+ const char *name;
+ unsigned long long memlock;
+};
+
+static int
+testCompareMemLock(const void *data)
+{
+ const struct testInfo *info = data;
+ virConnectPtr conn = NULL;
+ virDomainObjPtr vm = NULL;
+ virCommandPtr cmd = NULL;
+ char *xml = NULL;
+ int ret = -1;
+
+ if (!(conn = virGetConnect()))
+ goto cleanup;
+
+ if (virAsprintf(&xml, "%s/qemumemlockdata/qemumemlock-%s.xml",
+ abs_srcdir, info->name) < 0)
+ goto cleanup;
+
+ if (!(vm = virDomainObjNew(driver.xmlopt)))
+ goto cleanup;
+
+ if (!(vm->def = virDomainDefParseFile(xml, driver.caps, driver.xmlopt, NULL,
+ VIR_DOMAIN_DEF_PARSE_INACTIVE))) {
+ goto cleanup;
+ }
+
+ if (!(cmd = qemuProcessCreatePretendCmd(conn, &driver, vm, NULL, 0, false,
+ VIR_QEMU_PROCESS_START_COLD))) {
+ goto cleanup;
+ }
+
+ if (virTestCompareToULL(info->memlock, virCommandGetMaxMemLock(cmd)) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ virCommandFree(cmd);
+ virObjectUnref(vm);
+ virObjectUnref(conn);
+ VIR_FREE(xml);
+
+ return ret;
+}
+
+
+int
+main(void)
+{
+ virQEMUCapsPtr qemuCaps = NULL;
+ int ret = 0;
+
+ abs_top_srcdir = getenv("abs_top_srcdir");
+ if (!abs_top_srcdir)
+ abs_top_srcdir = abs_srcdir "/..";
+
+ if (qemuTestDriverInit(&driver) < 0)
+ return EXIT_FAILURE;
+
+ driver.privileged = true;
+
+ /* QEMU capabilites are the same for all tests */
+ if (!(qemuCaps = virQEMUCapsNew()))
+ return EXIT_FAILURE;
+
+ virQEMUCapsSetList(qemuCaps,
+ QEMU_CAPS_KVM, QEMU_CAPS_REALTIME_MLOCK,
+ QEMU_CAPS_DEVICE_VFIO_PCI);
+
+ if (qemuTestCapsCacheInsert(driver.qemuCapsCache, "qemumemlock", qemuCaps) < 0)
+ return EXIT_FAILURE;
+
+ virObjectUnref(qemuCaps);
+
+# define DO_TEST(name, memlock) \
+ do { \
+ static struct testInfo info = { \
+ name, memlock \
+ }; \
+ if (virTestRun("QEMU MEMLOCK " name, testCompareMemLock, &info) < 0) \
+ ret = -1; \
+ } while (0)
+
+ /* The tests below make sure that the memory locking limit is being
+ * calculated correctly in a number of situations. Each test is
+ * performed both on x86_64/pc and ppc64/pseries in order to account
+ * for some architecture-specific details.
+ *
+ * kvm: simple KMV guest
+ * tcg: simple TCG guest
+ *
+ * hardlimit: guest where <memtune><hard_limit> has been configured
+ * locked: guest where <memoryBacking><locked> has been enabled
+ * hostdev: guest that has some hostdev assigned
+ *
+ * The remaining tests cover different combinations of the above to
+ * ensure settings are prioritized as expected.
+ */
+
+ qemuTestSetHostArch(driver.caps, VIR_ARCH_X86_64);
+
+ DO_TEST("pc-kvm", 0);
+ DO_TEST("pc-tcg", 0);
+
+ DO_TEST("pc-hardlimit", 2147483648);
+ DO_TEST("pc-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
+ DO_TEST("pc-hostdev", 2147483648);
+
+ DO_TEST("pc-hardlimit+locked", 2147483648);
+ DO_TEST("pc-hardlimit+hostdev", 2147483648);
+ DO_TEST("pc-hardlimit+locked+hostdev", 2147483648);
+ DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
+
+ qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
+
+ DO_TEST("pseries-kvm", 20971520);
+ DO_TEST("pseries-tcg", 0);
+
+ DO_TEST("pseries-hardlimit", 2147483648);
+ DO_TEST("pseries-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
+ DO_TEST("pseries-hostdev", 2168455168);
+
+ DO_TEST("pseries-hardlimit+locked", 2147483648);
+ DO_TEST("pseries-hardlimit+hostdev", 2147483648);
+ DO_TEST("pseries-hardlimit+locked+hostdev", 2147483648);
+ DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
+
+ qemuTestDriverFree(&driver);
+
+ return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+#else
+
+int main(void)
+{
+ return EXIT_AM_SKIP;
+}
+
+#endif /* WITH_QEMU */
--
2.7.4
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, 2017-03-23 at 19:16 +0100, Andrea Bolognani wrote:
> These tests cover a number of scenarios where we care about
> the memory locking limit being set correctly for the guest
> to work properly.
[...]
> diff --git a/tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml b/tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml
> new file mode 100644
> index 0000000..daf70a4
> --- /dev/null
> +++ b/tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml
> @@ -0,0 +1,17 @@
> +<domain type='kvm'>
> + <name>guest</name>
> + <memory unit='KiB'>1048576</memory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='ppc64' machine='pseries'>hvm</type>
> + </os>
> + <devices>
> + <emulator>/usr/bin/qemu-system-ppc64</emulator>
> + <hostdev mode='subsystem' type='pci' managed='yes'>
> + <driver name='vfio'/>
> + <source>
> + <address domain='0x0000' bus='0x04' slot='0x02' function='0x0'/>
> + </source>
> + </hostdev>
> + </devices>
> +</domain>
> diff --git a/tests/qemumemlockdata/qemumemlock-pseries-kvm.xml b/tests/qemumemlockdata/qemumemlock-pseries-kvm.xml
> new file mode 100644
> index 0000000..5a065da
> --- /dev/null
> +++ b/tests/qemumemlockdata/qemumemlock-pseries-kvm.xml
> @@ -0,0 +1,11 @@
> +<domain type='kvm'>
> + <name>guest</name>
> + <memory unit='KiB'>1048576</memory>
> + <vcpu placement='static'>1</vcpu>
> + <os>
> + <type arch='ppc64' machine='pseries'>hvm</type>
> + </os>
> + <devices>
> + <emulator>/usr/bin/qemu-system-ppc64</emulator>
> + </devices>
> +</domain>
[...]
> + qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
> +
> + DO_TEST("pseries-kvm", 20971520);
[...]
> + DO_TEST("pseries-hostdev", 2168455168);
Hi David,
since I'm finally introducing test suite coverage for this,
it would be great if you could double-check that the values
we're going to test against actually make sense :)
You can see the configuration for the guests above: they
both have 1 GiB of RAM and use KVM, but one of the two is
using device assignment. The sizes are in bytes, so that's
~20 MiB for the basic guest and ~2 GiB for the one using
device assignment.
For reference, the code doing the calculation is
https://github.com/libvirt/libvirt/blob/9b93c4c26483308371aae3ae30bf5536c88b7f4b/src/qemu/qemu_domain.c#L6234-L6310
--
Andrea Bolognani / Red Hat / Virtualization
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, Mar 23, 2017 at 07:16:46PM +0100, Andrea Bolognani wrote:
>These tests cover a number of scenarios where we care about
>the memory locking limit being set correctly for the guest
>to work properly.
>---
> tests/Makefile.am | 9 ++
> .../qemumemlock-pc-hardlimit+hostdev.xml | 20 +++
> .../qemumemlock-pc-hardlimit+locked+hostdev.xml | 23 +++
> .../qemumemlock-pc-hardlimit+locked.xml | 17 ++
> tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml | 14 ++
> tests/qemumemlockdata/qemumemlock-pc-hostdev.xml | 17 ++
> tests/qemumemlockdata/qemumemlock-pc-kvm.xml | 11 ++
> .../qemumemlock-pc-locked+hostdev.xml | 20 +++
> tests/qemumemlockdata/qemumemlock-pc-locked.xml | 14 ++
> tests/qemumemlockdata/qemumemlock-pc-tcg.xml | 11 ++
> .../qemumemlock-pseries-hardlimit+hostdev.xml | 20 +++
> ...emumemlock-pseries-hardlimit+locked+hostdev.xml | 23 +++
> .../qemumemlock-pseries-hardlimit+locked.xml | 17 ++
> .../qemumemlock-pseries-hardlimit.xml | 14 ++
> .../qemumemlock-pseries-hostdev.xml | 17 ++
> tests/qemumemlockdata/qemumemlock-pseries-kvm.xml | 11 ++
> .../qemumemlock-pseries-locked+hostdev.xml | 20 +++
> .../qemumemlockdata/qemumemlock-pseries-locked.xml | 14 ++
> tests/qemumemlockdata/qemumemlock-pseries-tcg.xml | 11 ++
> tests/qemumemlocktest.c | 172 +++++++++++++++++++++
> 20 files changed, 475 insertions(+)
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit+hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked+hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit+locked.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hardlimit.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-kvm.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-locked+hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-locked.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pc-tcg.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit+hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked+hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit+locked.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hardlimit.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-kvm.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-locked+hostdev.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-locked.xml
> create mode 100644 tests/qemumemlockdata/qemumemlock-pseries-tcg.xml
> create mode 100644 tests/qemumemlocktest.c
>
[...]
>diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c
>new file mode 100644
>index 0000000..9e65622
>--- /dev/null
>+++ b/tests/qemumemlocktest.c
>@@ -0,0 +1,172 @@
>+#include <config.h>
>+
>+#include <stdio.h>
>+#include <stdlib.h>
>+#include <unistd.h>
>+#include <string.h>
>+
>+#include <sys/types.h>
>+#include <fcntl.h>
>+
>+#include "testutils.h"
>+
>+#ifdef WITH_QEMU
>+
>+# include "datatypes.h"
>+# include "internal.h"
>+# include "virstring.h"
>+# include "conf/domain_conf.h"
>+# include "qemu/qemu_capabilities.h"
>+# include "qemu/qemu_process.h"
>+
>+# include "testutilsqemu.h"
>+
>+# define VIR_FROM_THIS VIR_FROM_QEMU
>+
>+static const char *abs_top_srcdir;
>+static virQEMUDriver driver;
>+
>+struct testInfo {
>+ const char *name;
>+ unsigned long long memlock;
>+};
>+
>+static int
>+testCompareMemLock(const void *data)
>+{
>+ const struct testInfo *info = data;
>+ virConnectPtr conn = NULL;
>+ virDomainObjPtr vm = NULL;
>+ virCommandPtr cmd = NULL;
>+ char *xml = NULL;
>+ int ret = -1;
>+
>+ if (!(conn = virGetConnect()))
>+ goto cleanup;
>+
>+ if (virAsprintf(&xml, "%s/qemumemlockdata/qemumemlock-%s.xml",
>+ abs_srcdir, info->name) < 0)
>+ goto cleanup;
>+
>+ if (!(vm = virDomainObjNew(driver.xmlopt)))
>+ goto cleanup;
>+
>+ if (!(vm->def = virDomainDefParseFile(xml, driver.caps, driver.xmlopt, NULL,
>+ VIR_DOMAIN_DEF_PARSE_INACTIVE))) {
>+ goto cleanup;
>+ }
>+
>+ if (!(cmd = qemuProcessCreatePretendCmd(conn, &driver, vm, NULL, 0, false,
>+ VIR_QEMU_PROCESS_START_COLD))) {
>+ goto cleanup;
>+ }
>+
Going through all this, just to check one number seems too much. And it
doesn't actually test much more than simple call to
qemuDomainGetMemLockLimitBytes(def) would.
>+ if (virTestCompareToULL(info->memlock, virCommandGetMaxMemLock(cmd)) < 0)
>+ goto cleanup;
>+
>+ ret = 0;
>+
>+ cleanup:
>+ virCommandFree(cmd);
>+ virObjectUnref(vm);
>+ virObjectUnref(conn);
>+ VIR_FREE(xml);
>+
>+ return ret;
>+}
>+
>+
>+int
>+main(void)
Use different name (e.g. mymain) and VIRT_TEST_MAIN()
>+{
>+ virQEMUCapsPtr qemuCaps = NULL;
>+ int ret = 0;
>+
>+ abs_top_srcdir = getenv("abs_top_srcdir");
>+ if (!abs_top_srcdir)
>+ abs_top_srcdir = abs_srcdir "/..";
>+
>+ if (qemuTestDriverInit(&driver) < 0)
>+ return EXIT_FAILURE;
>+
>+ driver.privileged = true;
>+
>+ /* QEMU capabilites are the same for all tests */
>+ if (!(qemuCaps = virQEMUCapsNew()))
>+ return EXIT_FAILURE;
>+
>+ virQEMUCapsSetList(qemuCaps,
>+ QEMU_CAPS_KVM, QEMU_CAPS_REALTIME_MLOCK,
>+ QEMU_CAPS_DEVICE_VFIO_PCI);
You should add QEMU_CAPS_LAST here. Do you even need capabilities with
the upper part removed?
Other than that it looks fine.
>+
>+ if (qemuTestCapsCacheInsert(driver.qemuCapsCache, "qemumemlock", qemuCaps) < 0)
>+ return EXIT_FAILURE;
>+
>+ virObjectUnref(qemuCaps);
>+
>+# define DO_TEST(name, memlock) \
>+ do { \
>+ static struct testInfo info = { \
>+ name, memlock \
>+ }; \
>+ if (virTestRun("QEMU MEMLOCK " name, testCompareMemLock, &info) < 0) \
>+ ret = -1; \
>+ } while (0)
>+
>+ /* The tests below make sure that the memory locking limit is being
>+ * calculated correctly in a number of situations. Each test is
>+ * performed both on x86_64/pc and ppc64/pseries in order to account
>+ * for some architecture-specific details.
>+ *
>+ * kvm: simple KMV guest
>+ * tcg: simple TCG guest
>+ *
>+ * hardlimit: guest where <memtune><hard_limit> has been configured
>+ * locked: guest where <memoryBacking><locked> has been enabled
>+ * hostdev: guest that has some hostdev assigned
>+ *
>+ * The remaining tests cover different combinations of the above to
>+ * ensure settings are prioritized as expected.
>+ */
>+
>+ qemuTestSetHostArch(driver.caps, VIR_ARCH_X86_64);
>+
>+ DO_TEST("pc-kvm", 0);
>+ DO_TEST("pc-tcg", 0);
>+
>+ DO_TEST("pc-hardlimit", 2147483648);
>+ DO_TEST("pc-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
>+ DO_TEST("pc-hostdev", 2147483648);
>+
>+ DO_TEST("pc-hardlimit+locked", 2147483648);
>+ DO_TEST("pc-hardlimit+hostdev", 2147483648);
>+ DO_TEST("pc-hardlimit+locked+hostdev", 2147483648);
>+ DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
>+
>+ qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
>+
>+ DO_TEST("pseries-kvm", 20971520);
>+ DO_TEST("pseries-tcg", 0);
>+
>+ DO_TEST("pseries-hardlimit", 2147483648);
>+ DO_TEST("pseries-locked", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
>+ DO_TEST("pseries-hostdev", 2168455168);
>+
>+ DO_TEST("pseries-hardlimit+locked", 2147483648);
>+ DO_TEST("pseries-hardlimit+hostdev", 2147483648);
>+ DO_TEST("pseries-hardlimit+locked+hostdev", 2147483648);
>+ DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
>+
>+ qemuTestDriverFree(&driver);
>+
>+ return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
>+}
>+
>+#else
>+
>+int main(void)
>+{
>+ return EXIT_AM_SKIP;
>+}
>+
>+#endif /* WITH_QEMU */
>--
>2.7.4
>
>--
>libvir-list mailing list
>libvir-list@redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Mon, 2017-03-27 at 15:26 +0200, Martin Kletzander wrote:
[...]
> > + if (!(cmd = qemuProcessCreatePretendCmd(conn, &driver, vm, NULL, 0, false,
> > + VIR_QEMU_PROCESS_START_COLD))) {
> > + goto cleanup;
> > + }
> > +
>
> Going through all this, just to check one number seems too much. And it
> doesn't actually test much more than simple call to
> qemuDomainGetMemLockLimitBytes(def) would.
You're of course completely right :)
[...]
> > +int
> > +main(void)
>
> Use different name (e.g. mymain) and VIRT_TEST_MAIN()
Done.
--
Andrea Bolognani / Red Hat / Virtualization
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2026 Red Hat, Inc.