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
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@citrix.com>
---
CC: Ian Jackson <iwj@xenproject.org>
CC: Wei Liu <wl@xen.org>
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Wei Liu <wl@xen.org>
CC: Stefano Stabellini <sstabellini@kernel.org>
CC: Julien Grall <julien@xen.org>
CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
CC: Oleksandr <olekstysh@gmail.com>
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
Andrew Cooper writes ("[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. FTAOD Release-Acked-by: Ian Jackson <iwj@xenproject.org>
Hi Andrew. [Sorry for the possible format issues] On Tue, Feb 2, 2021 at 9:10 PM Andrew Cooper <andrew.cooper3@citrix.com> wrote: > 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@citrix.com> > --- > CC: Ian Jackson <iwj@xenproject.org> > CC: Wei Liu <wl@xen.org> > CC: Jan Beulich <JBeulich@suse.com> > CC: Roger Pau Monné <roger.pau@citrix.com> > CC: Wei Liu <wl@xen.org> > CC: Stefano Stabellini <sstabellini@kernel.org> > CC: Julien Grall <julien@xen.org> > CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com> > CC: Oleksandr <olekstysh@gmail.com> > > 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. > Yes, as it was agreed on IRC, I will test this today's evening and inform about the results) > > 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 > > -- Regards, Oleksandr Tyshchenko
On 04.02.21 15:29, Oleksandr Tyshchenko wrote: Hi Andrew > > Hi Andrew. > [Sorry for the possible format issues] > > On Tue, Feb 2, 2021 at 9:10 PM Andrew Cooper > <andrew.cooper3@citrix.com <mailto:andrew.cooper3@citrix.com>> wrote: > > 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@citrix.com > <mailto:andrew.cooper3@citrix.com>> > --- > CC: Ian Jackson <iwj@xenproject.org <mailto:iwj@xenproject.org>> > CC: Wei Liu <wl@xen.org <mailto:wl@xen.org>> > CC: Jan Beulich <JBeulich@suse.com <mailto:JBeulich@suse.com>> > CC: Roger Pau Monné <roger.pau@citrix.com > <mailto:roger.pau@citrix.com>> > CC: Wei Liu <wl@xen.org <mailto:wl@xen.org>> > CC: Stefano Stabellini <sstabellini@kernel.org > <mailto:sstabellini@kernel.org>> > CC: Julien Grall <julien@xen.org <mailto:julien@xen.org>> > CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com > <mailto:Volodymyr_Babchuk@epam.com>> > CC: Oleksandr <olekstysh@gmail.com <mailto:olekstysh@gmail.com>> > > 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. > > Yes, as it was agreed on IRC, I will test this today's evening and > inform about the results) OK, well, I decided to test right away because going to be busy in the evening) I am based on: 9dc687f x86/debug: fix page-overflow bug in dbg_rw_guest_mem I noticed the error during building this test in my Yocto environment on Arm: /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/8.2.0/ld: test-resource.o: undefined reference to symbol 'xendevicemodel_open@@VERS_1.0' /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/8.2.0/ld: /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/git/tools/tests/resource/../../../tools/libs/devicemodel/libxendevicemodel.so.1: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status Makefile:38: recipe for target 'test-resource' failed I didn't investigate whether it is related or not. I just added as following: diff --git a/tools/tests/resource/Makefile b/tools/tests/resource/Makefile index 8a3373e..03b19ef 100644 --- a/tools/tests/resource/Makefile +++ b/tools/tests/resource/Makefile @@ -32,6 +32,7 @@ CFLAGS += $(APPEND_CFLAGS) LDFLAGS += $(LDLIBS_libxenctrl) LDFLAGS += $(LDLIBS_libxenforeignmemory) +LDFLAGS += $(LDLIBS_libxendevicemodel) LDFLAGS += $(APPEND_LDFLAGS) test-resource: test-resource.o I got the following result without and with "[PATCH v9 01/11] xen/memory: Fix mapping grant tables with XENMEM_acquire_resource" root@generic-armv8-xt-dom0:~# test-resource XENMEM_acquire_resource tests Test ARM d3: grant table xenforeignmemory: error: ioctl failed: Invalid argument Fail: Get size: 22 - Invalid argument > > > 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 > > > > -- > Regards, > > Oleksandr Tyshchenko -- Regards, Oleksandr Tyshchenko
On 04/02/2021 15:38, Oleksandr wrote: >> >> Hi Andrew. >> [Sorry for the possible format issues] >> >> On Tue, Feb 2, 2021 at 9:10 PM Andrew Cooper >> <andrew.cooper3@citrix.com <mailto:andrew.cooper3@citrix.com>> wrote: >> >> 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@citrix.com >> <mailto:andrew.cooper3@citrix.com>> >> --- >> CC: Ian Jackson <iwj@xenproject.org <mailto:iwj@xenproject.org>> >> CC: Wei Liu <wl@xen.org <mailto:wl@xen.org>> >> CC: Jan Beulich <JBeulich@suse.com <mailto:JBeulich@suse.com>> >> CC: Roger Pau Monné <roger.pau@citrix.com >> <mailto:roger.pau@citrix.com>> >> CC: Wei Liu <wl@xen.org <mailto:wl@xen.org>> >> CC: Stefano Stabellini <sstabellini@kernel.org >> <mailto:sstabellini@kernel.org>> >> CC: Julien Grall <julien@xen.org <mailto:julien@xen.org>> >> CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com >> <mailto:Volodymyr_Babchuk@epam.com>> >> CC: Oleksandr <olekstysh@gmail.com <mailto:olekstysh@gmail.com>> >> >> 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. >> >> Yes, as it was agreed on IRC, I will test this today's evening and >> inform about the results) > > > OK, well, I decided to test right away because going to be busy in the > evening) > > I am based on: > 9dc687f x86/debug: fix page-overflow bug in dbg_rw_guest_mem > > I noticed the error during building this test in my Yocto environment > on Arm: > > > /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/8.2.0/ld: > test-resource.o: undefined reference to symbol > 'xendevicemodel_open@@VERS_1.0' > /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/8.2.0/ld: > /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/git/tools/tests/resource/../../../tools/libs/devicemodel/libxendevicemodel.so.1: > error adding symbols: DSO missing from command line > collect2: error: ld returned 1 exit status > Makefile:38: recipe for target 'test-resource' failed > > > I didn't investigate whether it is related or not. I just added as > following: > > diff --git a/tools/tests/resource/Makefile b/tools/tests/resource/Makefile > index 8a3373e..03b19ef 100644 > --- a/tools/tests/resource/Makefile > +++ b/tools/tests/resource/Makefile > @@ -32,6 +32,7 @@ CFLAGS += $(APPEND_CFLAGS) > > LDFLAGS += $(LDLIBS_libxenctrl) > LDFLAGS += $(LDLIBS_libxenforeignmemory) > +LDFLAGS += $(LDLIBS_libxendevicemodel) > LDFLAGS += $(APPEND_LDFLAGS) > > test-resource: test-resource.o > Urgh yes - I didn't fully strip out the libxendevicemodel uses. I'll fix that, rather than having this test link against a library which it doesn't use (yet). > > I got the following result without and with "[PATCH v9 01/11] > xen/memory: Fix mapping grant tables with XENMEM_acquire_resource" > > root@generic-armv8-xt-dom0:~# test-resource > XENMEM_acquire_resource tests > Test ARM > d3: grant table > xenforeignmemory: error: ioctl failed: Invalid argument > Fail: Get size: 22 - Invalid argument > Ah yes - you also need a bugfix in the dom0 kernel. "xen/privcmd: allow fetching resource sizes" which is in mainline, and also backported to the LTS trees. However, this did get past the bit I wasn't sure about for ARM, which is good. ~Andrew
Hi Andrew On 04.02.21 17:44, Andrew Cooper wrote: > On 04/02/2021 15:38, Oleksandr wrote: >>> >>> Hi Andrew. >>> [Sorry for the possible format issues] >>> >>> On Tue, Feb 2, 2021 at 9:10 PM Andrew Cooper >>> <andrew.cooper3@citrix.com <mailto:andrew.cooper3@citrix.com>> wrote: >>> >>> 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@citrix.com >>> <mailto:andrew.cooper3@citrix.com>> >>> --- >>> CC: Ian Jackson <iwj@xenproject.org <mailto:iwj@xenproject.org>> >>> CC: Wei Liu <wl@xen.org <mailto:wl@xen.org>> >>> CC: Jan Beulich <JBeulich@suse.com <mailto:JBeulich@suse.com>> >>> CC: Roger Pau Monné <roger.pau@citrix.com >>> <mailto:roger.pau@citrix.com>> >>> CC: Wei Liu <wl@xen.org <mailto:wl@xen.org>> >>> CC: Stefano Stabellini <sstabellini@kernel.org >>> <mailto:sstabellini@kernel.org>> >>> CC: Julien Grall <julien@xen.org <mailto:julien@xen.org>> >>> CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com >>> <mailto:Volodymyr_Babchuk@epam.com>> >>> CC: Oleksandr <olekstysh@gmail.com <mailto:olekstysh@gmail.com>> >>> >>> 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. >>> >>> Yes, as it was agreed on IRC, I will test this today's evening and >>> inform about the results) >> >> >> OK, well, I decided to test right away because going to be busy in >> the evening) >> >> I am based on: >> 9dc687f x86/debug: fix page-overflow bug in dbg_rw_guest_mem >> >> I noticed the error during building this test in my Yocto environment >> on Arm: >> >> >> /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/8.2.0/ld: >> test-resource.o: undefined reference to symbol >> 'xendevicemodel_open@@VERS_1.0' >> /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/recipe-sysroot-native/usr/bin/aarch64-poky-linux/../../libexec/aarch64-poky-linux/gcc/aarch64-poky-linux/8.2.0/ld: >> /media/b/build/build/tmp/work/x86_64-xt-linux/dom0-image-thin-initramfs/1.0-r0/repo/build/tmp/work/aarch64-poky-linux/xen/4.14.0+gitAUTOINC+e00e0f38c3-r0/git/tools/tests/resource/../../../tools/libs/devicemodel/libxendevicemodel.so.1: >> error adding symbols: DSO missing from command line >> collect2: error: ld returned 1 exit status >> Makefile:38: recipe for target 'test-resource' failed >> >> >> I didn't investigate whether it is related or not. I just added as >> following: >> >> diff --git a/tools/tests/resource/Makefile >> b/tools/tests/resource/Makefile >> index 8a3373e..03b19ef 100644 >> --- a/tools/tests/resource/Makefile >> +++ b/tools/tests/resource/Makefile >> @@ -32,6 +32,7 @@ CFLAGS += $(APPEND_CFLAGS) >> >> LDFLAGS += $(LDLIBS_libxenctrl) >> LDFLAGS += $(LDLIBS_libxenforeignmemory) >> +LDFLAGS += $(LDLIBS_libxendevicemodel) >> LDFLAGS += $(APPEND_LDFLAGS) >> >> test-resource: test-resource.o >> > > Urgh yes - I didn't fully strip out the libxendevicemodel uses. I'll > fix that, rather than having this test link against a library which it > doesn't use (yet). > >> >> I got the following result without and with "[PATCH v9 01/11] >> xen/memory: Fix mapping grant tables with XENMEM_acquire_resource" >> >> root@generic-armv8-xt-dom0:~# test-resource >> XENMEM_acquire_resource tests >> Test ARM >> d3: grant table >> xenforeignmemory: error: ioctl failed: Invalid argument >> Fail: Get size: 22 - Invalid argument >> > > Ah yes - you also need a bugfix in the dom0 kernel. "xen/privcmd: > allow fetching resource sizes" which is in mainline, and also > backported to the LTS trees. Well, my dom0 Linux is old) uname -a Linux generic-armv8-xt-dom0 4.14.75-ltsi-yocto-tiny #1 SMP PREEMPT Thu Nov 5 10:52:32 UTC 2020 aarch64 GNU/Linux so I use ported "xen/privcmd: add IOCTL_PRIVCMD_MMAP_RESOURCE". I didn't find "xen/privcmd: allow fetching resource sizes" for my Linux version, so I backported it by myself. So, with "[PATCH v9 01/11] xen/memory: Fix mapping grant tables with XENMEM_acquire_resource" root@generic-armv8-xt-dom0:~# test-resource XENMEM_acquire_resource tests Test ARM d7: grant table (XEN) grant_table.c:1854:d0v1 Expanding d7 grant table from 1 to 32 frames (XEN) grant_table.c:1854:d0v1 Expanding d7 grant table from 32 to 40 frames [I didn't test without your patch] Hope that helps. > > However, this did get past the bit I wasn't sure about for ARM, which > is good. > > ~Andrew -- Regards, Oleksandr Tyshchenko
On 04/02/2021 16:33, Oleksandr wrote: > On 04.02.21 17:44, Andrew Cooper wrote: >> On 04/02/2021 15:38, Oleksandr wrote: >>> >>> >>> I got the following result without and with "[PATCH v9 01/11] >>> xen/memory: Fix mapping grant tables with XENMEM_acquire_resource" >>> >>> root@generic-armv8-xt-dom0:~# test-resource >>> XENMEM_acquire_resource tests >>> Test ARM >>> d3: grant table >>> xenforeignmemory: error: ioctl failed: Invalid argument >>> Fail: Get size: 22 - Invalid argument >>> >> >> Ah yes - you also need a bugfix in the dom0 kernel. "xen/privcmd: >> allow fetching resource sizes" which is in mainline, and also >> backported to the LTS trees. > > Well, my dom0 Linux is old) > > uname -a > Linux generic-armv8-xt-dom0 4.14.75-ltsi-yocto-tiny #1 SMP PREEMPT Thu > Nov 5 10:52:32 UTC 2020 aarch64 GNU/Linux > so I use ported "xen/privcmd: add IOCTL_PRIVCMD_MMAP_RESOURCE". > I didn't find "xen/privcmd: allow fetching resource sizes" for my > Linux version, so I backported it by myself. > > So, with "[PATCH v9 01/11] xen/memory: Fix mapping grant tables with > XENMEM_acquire_resource" > > root@generic-armv8-xt-dom0:~# test-resource > XENMEM_acquire_resource tests > Test ARM > d7: grant table > (XEN) grant_table.c:1854:d0v1 Expanding d7 grant table from 1 to 32 frames > (XEN) grant_table.c:1854:d0v1 Expanding d7 grant table from 32 to 40 > frames > > [I didn't test without your patch] > > Hope that helps. > Yup - fantastic thankyou. ~Andrew
© 2016 - 2024 Red Hat, Inc.