[libvirt] [PATCH 19/21] tests: Add virresctrltest

Martin Kletzander mkletzan at redhat.com
Mon Nov 13 08:50:34 UTC 2017


This test has 2 different uses:

 1) DO_TEST_FREE initializes capabilities from vircaps2xmldata (since it exists
    there already) and then requests list of free bitmaps (all unallocated
    space) from virresctrl.c

 2) DO_TEST_ALLOC takes capabilities from vircaps2xmldata, and uses resctrl info
    to request an allocation from virresctrl.c for a VM from
    genericxml2xmlindata.

Desirable outputs are saved in virresctrldata.

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 tests/Makefile.am                                  |   8 +-
 .../resctrl--cachetune/vcpus-0-1.alloc             |   1 +
 .../resctrl--cachetune/vcpus-3.alloc               |   1 +
 .../resctrl-cdp--cachetune-cdp/vcpus-0-1.alloc     |   2 +
 .../resctrl-cdp--cachetune-cdp/vcpus-2.alloc       |   1 +
 .../resctrl-cdp--cachetune-cdp/vcpus-3.alloc       |   1 +
 tests/virresctrldata/resctrl-cdp.schemata          |   2 +
 .../virresctrldata/resctrl-skx-twocaches.schemata  |   1 +
 tests/virresctrldata/resctrl-skx.schemata          |   1 +
 tests/virresctrldata/resctrl.schemata              |   1 +
 tests/virresctrltest.c                             | 277 +++++++++++++++++++++
 11 files changed, 295 insertions(+), 1 deletion(-)
 create mode 100644 tests/virresctrldata/resctrl--cachetune/vcpus-0-1.alloc
 create mode 100644 tests/virresctrldata/resctrl--cachetune/vcpus-3.alloc
 create mode 100644 tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-0-1.alloc
 create mode 100644 tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-2.alloc
 create mode 100644 tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-3.alloc
 create mode 100644 tests/virresctrldata/resctrl-cdp.schemata
 create mode 100644 tests/virresctrldata/resctrl-skx-twocaches.schemata
 create mode 100644 tests/virresctrldata/resctrl-skx.schemata
 create mode 100644 tests/virresctrldata/resctrl.schemata
 create mode 100644 tests/virresctrltest.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index effa259e3a45..04695c0ad250 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -231,6 +231,7 @@ if WITH_LINUX
 test_programs += fchosttest
 test_programs += scsihosttest
 test_programs += vircaps2xmltest
+test_programs += virresctrltest
 test_libraries += virusbmock.la \
 	virnetdevbandwidthmock.la \
 	virnumamock.la \
@@ -1172,8 +1173,13 @@ virnumamock_la_CFLAGS = $(AM_CFLAGS)
 virnumamock_la_LDFLAGS = $(MOCKLIBS_LDFLAGS)
 virnumamock_la_LIBADD = $(MOCKLIBS_LIBS)
 
+virresctrltest_SOURCES = \
+	virresctrltest.c testutils.h testutils.c virfilewrapper.h virfilewrapper.c
+virresctrltest_LDADD = $(LDADDS)
+
 else ! WITH_LINUX
-EXTRA_DIST += vircaps2xmltest.c virnumamock.c virfilewrapper.c virfilewrapper.h
+EXTRA_DIST += vircaps2xmltest.c virnumamock.c virfilewrapper.c \
+			  virfilewrapper.h virresctrltest.c
 endif ! WITH_LINUX
 
 if WITH_NSS
diff --git a/tests/virresctrldata/resctrl--cachetune/vcpus-0-1.alloc b/tests/virresctrldata/resctrl--cachetune/vcpus-0-1.alloc
new file mode 100644
index 000000000000..6f48dd99d5a1
--- /dev/null
+++ b/tests/virresctrldata/resctrl--cachetune/vcpus-0-1.alloc
@@ -0,0 +1 @@
+L3:0=0000f;1=000f0
diff --git a/tests/virresctrldata/resctrl--cachetune/vcpus-3.alloc b/tests/virresctrldata/resctrl--cachetune/vcpus-3.alloc
new file mode 100644
index 000000000000..b47a36fecc8a
--- /dev/null
+++ b/tests/virresctrldata/resctrl--cachetune/vcpus-3.alloc
@@ -0,0 +1 @@
+L3:0=000f0
diff --git a/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-0-1.alloc b/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-0-1.alloc
new file mode 100644
index 000000000000..44886a2cfe38
--- /dev/null
+++ b/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-0-1.alloc
@@ -0,0 +1,2 @@
+L3CODE:0=00ffc
+L3DATA:1=0001f
diff --git a/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-2.alloc b/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-2.alloc
new file mode 100644
index 000000000000..4225b0a36167
--- /dev/null
+++ b/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-2.alloc
@@ -0,0 +1 @@
+L3CODE:1=0ff00
diff --git a/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-3.alloc b/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-3.alloc
new file mode 100644
index 000000000000..10be6844bd38
--- /dev/null
+++ b/tests/virresctrldata/resctrl-cdp--cachetune-cdp/vcpus-3.alloc
@@ -0,0 +1 @@
+L3DATA:1=03fe0
diff --git a/tests/virresctrldata/resctrl-cdp.schemata b/tests/virresctrldata/resctrl-cdp.schemata
new file mode 100644
index 000000000000..2897e2afa603
--- /dev/null
+++ b/tests/virresctrldata/resctrl-cdp.schemata
@@ -0,0 +1,2 @@
+L3CODE:0=00ffc;1=0ff00
+L3DATA:0=00000;1=03fff
diff --git a/tests/virresctrldata/resctrl-skx-twocaches.schemata b/tests/virresctrldata/resctrl-skx-twocaches.schemata
new file mode 100644
index 000000000000..86b3801a04c2
--- /dev/null
+++ b/tests/virresctrldata/resctrl-skx-twocaches.schemata
@@ -0,0 +1 @@
+L3:0=001;1=400
diff --git a/tests/virresctrldata/resctrl-skx.schemata b/tests/virresctrldata/resctrl-skx.schemata
new file mode 100644
index 000000000000..5e8b0d636277
--- /dev/null
+++ b/tests/virresctrldata/resctrl-skx.schemata
@@ -0,0 +1 @@
+L3:0=70f
diff --git a/tests/virresctrldata/resctrl.schemata b/tests/virresctrldata/resctrl.schemata
new file mode 100644
index 000000000000..fa980e58c9dd
--- /dev/null
+++ b/tests/virresctrldata/resctrl.schemata
@@ -0,0 +1 @@
+L3:0=000ff;1=000f0
diff --git a/tests/virresctrltest.c b/tests/virresctrltest.c
new file mode 100644
index 000000000000..e84d9ff94299
--- /dev/null
+++ b/tests/virresctrltest.c
@@ -0,0 +1,277 @@
+#include <config.h>
+#include <stdlib.h>
+
+#include "testutils.h"
+#include "virfilewrapper.h"
+#include "virresctrlpriv.h"
+
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+struct virResctrlData {
+    const char *filename;
+    bool fail;
+    const char *test_name;
+};
+
+
+static int
+test_virResctrlGetFree(const void *opaque)
+{
+    struct virResctrlData *data = (struct virResctrlData *) opaque;
+    char *system_dir = NULL;
+    char *resctrl_dir = NULL;
+    int ret = -1;
+    virResctrlAllocPtr alloc = NULL;
+    char *schemata_str = NULL;
+    char *schemata_file;
+    virCapsPtr caps = NULL;
+
+    if (virAsprintf(&system_dir, "%s/vircaps2xmldata/linux-%s/system",
+                    abs_srcdir, data->filename) < 0)
+        goto cleanup;
+
+    if (virAsprintf(&resctrl_dir, "%s/vircaps2xmldata/linux-%s/resctrl",
+                    abs_srcdir, data->filename) < 0)
+        goto cleanup;
+
+    if (virAsprintf(&schemata_file, "%s/virresctrldata/%s.schemata",
+                    abs_srcdir, data->filename) < 0)
+        goto cleanup;
+
+    virFileWrapperAddPrefix("/sys/devices/system", system_dir);
+    virFileWrapperAddPrefix("/sys/fs/resctrl", resctrl_dir);
+
+    caps = virCapabilitiesNew(VIR_ARCH_X86_64, false, false);
+    if (!caps || virCapabilitiesInitCaches(caps) < 0) {
+        fprintf(stderr, "Could not initialize capabilities");
+        goto cleanup;
+    }
+
+    alloc = virResctrlAllocGetFree(caps->host.resctrl);
+
+    virFileWrapperClearPrefixes();
+
+    if (!alloc) {
+        if (data->fail)
+            ret = 0;
+        goto cleanup;
+    } else if (data->fail) {
+        VIR_TEST_DEBUG("Error expected but there wasn't any.\n");
+        ret = -1;
+        goto cleanup;
+    }
+
+    schemata_str = virResctrlAllocFormat(alloc);
+
+    if (virTestCompareToFile(schemata_str, schemata_file) < 0)
+        goto cleanup;
+
+    ret = 0;
+ cleanup:
+    virObjectUnref(caps);
+    virObjectUnref(alloc);
+    VIR_FREE(system_dir);
+    VIR_FREE(resctrl_dir);
+    VIR_FREE(schemata_str);
+    VIR_FREE(schemata_file);
+    return ret;
+}
+
+static int
+test_virResctrlGetAlloc(const void *opaque)
+{
+    struct virResctrlData *data = (struct virResctrlData *) opaque;
+    char *system_dir = NULL;
+    char *resctrl_dir = NULL;
+    int ret = -1;
+    int rv = 0;
+    virResctrlAllocPtr alloc = NULL;
+    char *schemata_str = NULL;
+    char *schemata_file = NULL;
+    char *domain_file = NULL;
+    char *vcpus = NULL;
+    virCapsPtr caps = NULL;
+    virDomainDefPtr def = NULL;
+    size_t i = 0;
+    virDomainXMLOptionPtr xmlopt = NULL;
+    void *save_ptr = NULL;
+
+    if (virAsprintf(&system_dir, "%s/vircaps2xmldata/linux-%s/system",
+                    abs_srcdir, data->filename) < 0)
+        goto cleanup;
+
+    if (virAsprintf(&resctrl_dir, "%s/vircaps2xmldata/linux-%s/resctrl",
+                    abs_srcdir, data->filename) < 0)
+        goto cleanup;
+
+    if (virAsprintf(&domain_file, "%s/genericxml2xmlindata/generic-%s.xml",
+                    abs_srcdir, data->test_name) < 0)
+        goto cleanup;
+
+    virFileWrapperAddPrefix("/sys/devices/system", system_dir);
+    virFileWrapperAddPrefix("/sys/fs/resctrl", resctrl_dir);
+
+    caps = virTestGenericCapsInit();
+    if (!caps || virCapabilitiesInitCaches(caps) < 0) {
+        fprintf(stderr, "Could not initialize capabilities");
+        goto cleanup;
+    }
+
+    xmlopt = virTestGenericDomainXMLConfInit();
+    if (!xmlopt)
+        goto cleanup;
+
+    def = virDomainDefParseFile(domain_file, caps, xmlopt, NULL,
+                                VIR_DOMAIN_DEF_PARSE_INACTIVE);
+    if (!def)
+        goto cleanup;
+
+    for (i = 0; i < def->ncachetunes; i++) {
+        if (virResctrlAllocMasksAssign(caps->host.resctrl,
+                                       def->cachetunes[i]->alloc,
+                                       &save_ptr) < 0) {
+            rv = -1;
+            break;
+        }
+    }
+
+    virFileWrapperClearPrefixes();
+
+    if (rv < 0) {
+        if (data->fail)
+            ret = 0;
+        goto cleanup;
+    } else if (data->fail) {
+        VIR_TEST_DEBUG("Error expected but there wasn't any.\n");
+        goto cleanup;
+    }
+
+    for (i = 0; i < def->ncachetunes; i++) {
+        VIR_FREE(vcpus);
+        vcpus = virBitmapFormat(def->cachetunes[i]->vcpus);
+
+        if (!vcpus)
+            goto cleanup;
+
+        VIR_FREE(schemata_file);
+        VIR_FREE(schemata_str);
+
+        if (virAsprintf(&schemata_file, "%s/virresctrldata/%s--%s/vcpus-%s.alloc",
+                        abs_srcdir, data->filename, data->test_name, vcpus) < 0)
+            goto cleanup;
+
+        schemata_str = virResctrlAllocFormat(def->cachetunes[i]->alloc);
+        if (!schemata_str)
+            goto cleanup;
+
+        if (virTestCompareToFile(schemata_str, schemata_file) < 0)
+            rv = -1;
+    }
+
+    ret = rv;
+ cleanup:
+    virObjectUnref(save_ptr);
+    virObjectUnref(caps);
+    virObjectUnref(alloc);
+    virObjectUnref(xmlopt);
+    VIR_FREE(system_dir);
+    VIR_FREE(resctrl_dir);
+    VIR_FREE(schemata_str);
+    VIR_FREE(schemata_file);
+    VIR_FREE(domain_file);
+    VIR_FREE(vcpus);
+    virDomainDefFree(def);
+    return ret;
+}
+
+static int
+mymain(void)
+{
+    struct virResctrlData data = {0};
+    int ret = 0;
+
+#define DO_TEST_FREE(_filename) \
+    do { \
+        data = (struct virResctrlData) { .filename = _filename }; \
+        if (virTestRun("Free: " _filename, test_virResctrlGetFree, &data) < 0) \
+            ret = -1; \
+    } while (0)
+
+#define DO_TEST_ALLOC_FULL(_filename, _test_name, _fail) \
+    do { \
+        data = (struct virResctrlData) { .filename = _filename, \
+                                         .test_name = _test_name, \
+                                         .fail = _fail }; \
+        if (virTestRun("Alloc: " _filename "+" _test_name, \
+                       test_virResctrlGetAlloc, &data) < 0) \
+            ret = -1; \
+    } while (0)
+
+#define DO_TEST_ALLOC(_filename, _test_name) \
+    DO_TEST_ALLOC_FULL(_filename, _test_name, false)
+
+#define DO_TEST_ALLOC_FAIL(_filename, _test_name) \
+    DO_TEST_ALLOC_FULL(_filename, _test_name, true)
+
+    DO_TEST_FREE("resctrl");
+    DO_TEST_FREE("resctrl-cdp");
+    DO_TEST_FREE("resctrl-skx");
+    DO_TEST_FREE("resctrl-skx-twocaches");
+
+
+    /*************
+     * Tests with generic-cachetune.xml (decently sized allocations for 2 caches)
+     ***/
+
+    /* Simplest one, this one should fail because there is not resctrl support
+     * on the host */
+    DO_TEST_ALLOC_FAIL("caches", "cachetune");
+
+    DO_TEST_ALLOC("resctrl", "cachetune");
+
+    /* This one should fail because there are allocations for two caches
+     * requested, but only one exists */
+    DO_TEST_ALLOC_FAIL("resctrl-skx", "cachetune");
+
+    /* This one should fail because there is not enough room available */
+    DO_TEST_ALLOC_FAIL("resctrl-skx-twocaches", "cachetune");
+
+    /* This one should fail because non-CDP allocation is requested on
+     * CDP-enabled system, support for this can be added in the future */
+    DO_TEST_ALLOC_FAIL("resctrl-cdp", "cachetune");
+
+    /*************
+     * Tests with generic-cachetune-small.xml (small allocation for 1 cache)
+     ***/
+
+    /* This one should fail because the allocation size is smaller than minimum
+     * (although with the right granularity) */
+    DO_TEST_ALLOC_FAIL("resctrl", "cachetune-small");
+
+    /* These two should fail because the allocations size is smaller than
+     * granularity */
+    DO_TEST_ALLOC_FAIL("resctrl-skx", "cachetune-small");
+    DO_TEST_ALLOC_FAIL("resctrl-skx-twocaches", "cachetune-small");
+
+    /* This one should fail because non-CDP allocation is requested on
+     * CDP-enabled system, support for this can be added in the future */
+    DO_TEST_ALLOC_FAIL("resctrl-cdp", "cachetune-small");
+
+    /*************
+     * Tests with generic-cachetune-cdp.xml (decently sized allocations,
+     * separate for code and data)
+     ***/
+
+    /* These should fail because CDP allocation is requested on non-CDP
+     * system */
+    DO_TEST_ALLOC_FAIL("resctrl", "cachetune-cdp");
+    DO_TEST_ALLOC_FAIL("resctrl-skx", "cachetune-cdp");
+    DO_TEST_ALLOC_FAIL("resctrl-skx-twocaches", "cachetune-cdp");
+
+    DO_TEST_ALLOC("resctrl-cdp", "cachetune-cdp");
+
+    return ret;
+}
+
+VIR_TEST_MAIN(mymain)
-- 
2.15.0




More information about the libvir-list mailing list