[PATCH for-4.15] tools/tests: Introduce a test for acquire_resource

Andrew Cooper posted 1 patch 3 years, 10 months ago
Test gitlab-ci failed
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20210202190937.30206-1-andrew.cooper3@citrix.com
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
[PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Andrew Cooper 3 years, 10 months ago
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


Re: [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Ian Jackson 3 years, 9 months ago
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>

Re: [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Oleksandr Tyshchenko 3 years, 9 months ago
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
Re: [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Oleksandr 3 years, 9 months ago
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

Re: [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Andrew Cooper 3 years, 9 months ago
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
Re: [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Oleksandr 3 years, 9 months ago
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

Re: [PATCH for-4.15] tools/tests: Introduce a test for acquire_resource
Posted by Andrew Cooper 3 years, 9 months ago
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