|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
For now, simply try to map 40 frames of grant table. This catches most of the
basic errors with resource sizes found and fixed through the 4.15 dev window.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Ian Jackson <iwj@xxxxxxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Wei Liu <wl@xxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Julien Grall <julien@xxxxxxx>
CC: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
CC: Oleksandr <olekstysh@xxxxxxxxx>
Fails against current staging:
XENMEM_acquire_resource tests
Test x86 PV
d7: grant table
Fail: Map 7 - Argument list too long
Test x86 PVH
d8: grant table
Fail: Map 7 - Argument list too long
The fix has already been posted:
[PATCH v9 01/11] xen/memory: Fix mapping grant tables with
XENMEM_acquire_resource
and the fixed run is:
XENMEM_acquire_resource tests
Test x86 PV
d7: grant table
Test x86 PVH
d8: grant table
ARM folk: would you mind testing this? I'm pretty sure the create parameters
are suitable, but I don't have any way to test this.
I've got more plans for this, but insufficient time right now.
---
tools/tests/Makefile | 1 +
tools/tests/resource/.gitignore | 1 +
tools/tests/resource/Makefile | 40 ++++++++++
tools/tests/resource/test-resource.c | 138 +++++++++++++++++++++++++++++++++++
4 files changed, 180 insertions(+)
create mode 100644 tools/tests/resource/.gitignore
create mode 100644 tools/tests/resource/Makefile
create mode 100644 tools/tests/resource/test-resource.c
diff --git a/tools/tests/Makefile b/tools/tests/Makefile
index fc9b715951..c45b5fbc1d 100644
--- a/tools/tests/Makefile
+++ b/tools/tests/Makefile
@@ -2,6 +2,7 @@ XEN_ROOT = $(CURDIR)/../..
include $(XEN_ROOT)/tools/Rules.mk
SUBDIRS-y :=
+SUBDIRS-y := resource
SUBDIRS-$(CONFIG_X86) += cpu-policy
SUBDIRS-$(CONFIG_X86) += mce-test
ifneq ($(clang),y)
diff --git a/tools/tests/resource/.gitignore b/tools/tests/resource/.gitignore
new file mode 100644
index 0000000000..4872e97d4b
--- /dev/null
+++ b/tools/tests/resource/.gitignore
@@ -0,0 +1 @@
+test-resource
diff --git a/tools/tests/resource/Makefile b/tools/tests/resource/Makefile
new file mode 100644
index 0000000000..8a3373e786
--- /dev/null
+++ b/tools/tests/resource/Makefile
@@ -0,0 +1,40 @@
+XEN_ROOT = $(CURDIR)/../../..
+include $(XEN_ROOT)/tools/Rules.mk
+
+TARGET := test-resource
+
+.PHONY: all
+all: $(TARGET)
+
+.PHONY: run
+run: $(TARGET)
+ ./$(TARGET)
+
+.PHONY: clean
+clean:
+ $(RM) -f -- *.o .*.d .*.d2 $(TARGET)
+
+.PHONY: distclean
+distclean: clean
+ $(RM) -f -- *~
+
+.PHONY: install
+install: all
+
+.PHONY: uninstall
+uninstall:
+
+CFLAGS += -Werror -D__XEN_TOOLS__
+CFLAGS += $(CFLAGS_xeninclude)
+CFLAGS += $(CFLAGS_libxenctrl)
+CFLAGS += $(CFLAGS_libxenforeginmemory)
+CFLAGS += $(APPEND_CFLAGS)
+
+LDFLAGS += $(LDLIBS_libxenctrl)
+LDFLAGS += $(LDLIBS_libxenforeignmemory)
+LDFLAGS += $(APPEND_LDFLAGS)
+
+test-resource: test-resource.o
+ $(CC) $(LDFLAGS) -o $@ $<
+
+-include $(DEPS_INCLUDE)
diff --git a/tools/tests/resource/test-resource.c
b/tools/tests/resource/test-resource.c
new file mode 100644
index 0000000000..81a2a5cd12
--- /dev/null
+++ b/tools/tests/resource/test-resource.c
@@ -0,0 +1,138 @@
+#include <err.h>
+#include <errno.h>
+#include <error.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/mman.h>
+
+#include <xenctrl.h>
+#include <xenforeignmemory.h>
+#include <xendevicemodel.h>
+#include <xen-tools/libs.h>
+
+static unsigned int nr_failures;
+#define fail(fmt, ...) \
+({ \
+ nr_failures++; \
+ (void)printf(fmt, ##__VA_ARGS__); \
+})
+
+static xc_interface *xch;
+static xenforeignmemory_handle *fh;
+static xendevicemodel_handle *dh;
+
+static void test_gnttab(uint32_t domid, unsigned int nr_frames)
+{
+ xenforeignmemory_resource_handle *res;
+ void *addr = NULL;
+ size_t size;
+ int rc;
+
+ printf(" d%u: grant table\n", domid);
+
+ rc = xenforeignmemory_resource_size(
+ fh, domid, XENMEM_resource_grant_table,
+ XENMEM_resource_grant_table_id_shared, &size);
+ if ( rc )
+ return fail(" Fail: Get size: %d - %s\n", errno, strerror(errno));
+
+ if ( (size >> XC_PAGE_SHIFT) != nr_frames )
+ return fail(" Fail: Get size: expected %u frames, got %zu\n",
+ nr_frames, size >> XC_PAGE_SHIFT);
+
+ res = xenforeignmemory_map_resource(
+ fh, domid, XENMEM_resource_grant_table,
+ XENMEM_resource_grant_table_id_shared, 0, size >> XC_PAGE_SHIFT,
+ &addr, PROT_READ | PROT_WRITE, 0);
+ if ( !res )
+ return fail(" Fail: Map %d - %s\n", errno, strerror(errno));
+
+ rc = xenforeignmemory_unmap_resource(fh, res);
+ if ( rc )
+ return fail(" Fail: Unmap %d - %s\n", errno, strerror(errno));
+}
+
+static void test_domain_configurations(void)
+{
+ static struct test {
+ const char *name;
+ struct xen_domctl_createdomain create;
+ } tests[] = {
+#if defined(__x86_64__) || defined(__i386__)
+ {
+ .name = "x86 PV",
+ .create = {
+ .max_vcpus = 2,
+ .max_grant_frames = 40,
+ },
+ },
+ {
+ .name = "x86 PVH",
+ .create = {
+ .flags = XEN_DOMCTL_CDF_hvm,
+ .max_vcpus = 2,
+ .max_grant_frames = 40,
+ .arch = {
+ .emulation_flags = XEN_X86_EMU_LAPIC,
+ },
+ },
+ },
+#elif defined(__aarch64__) || defined(__arm__)
+ {
+ .name = "ARM",
+ .create = {
+ .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap,
+ .max_vcpus = 2,
+ .max_grant_frames = 40,
+ },
+ },
+#endif
+ };
+
+ for ( unsigned int i = 0; i < ARRAY_SIZE(tests); ++i )
+ {
+ struct test *t = &tests[i];
+ uint32_t domid = 0;
+ int rc;
+
+ printf("Test %s\n", t->name);
+
+ rc = xc_domain_create(xch, &domid, &t->create);
+ if ( rc )
+ {
+ if ( errno == EINVAL || errno == EOPNOTSUPP )
+ printf(" Skip: %d - %s\n", errno, strerror(errno));
+ else
+ fail(" Domain create failure: %d - %s\n",
+ errno, strerror(errno));
+ continue;
+ }
+
+ test_gnttab(domid, t->create.max_grant_frames);
+
+ rc = xc_domain_destroy(xch, domid);
+ if ( rc )
+ fail(" Failed to destroy domain: %d - %s\n",
+ errno, strerror(errno));
+ }
+}
+
+int main(int argc, char **argv)
+{
+ printf("XENMEM_acquire_resource tests\n");
+
+ xch = xc_interface_open(NULL, NULL, 0);
+ fh = xenforeignmemory_open(NULL, 0);
+ dh = xendevicemodel_open(NULL, 0);
+
+ if ( !xch )
+ err(1, "xc_interface_open");
+ if ( !fh )
+ err(1, "xenforeignmemory_open");
+ if ( !dh )
+ err(1, "xendevicemodel_open");
+
+ test_domain_configurations();
+
+ return !!nr_failures;
+}
--
2.11.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |