[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 |