All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] xen: Memory claims fixes and testing
@ 2025-12-16 16:32 Andrew Cooper
  2025-12-16 16:32 ` [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains Andrew Cooper
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Andrew Cooper @ 2025-12-16 16:32 UTC (permalink / raw)
  To: Xen-devel
  Cc: Andrew Cooper, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Roger Pau Monné, Stefano Stabellini

Two bugfixes, and a test for some basic behaviour.

https://gitlab.com/xen-project/hardware/xen-staging/-/pipelines/2218133231

Andrew Cooper (4):
  xen/domain: Disallow XENMEM_claim_pages on dying domains
  tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages()
  tools/tests: Sort Makefile
  tools/tests: Memory Claims

 tools/libs/ctrl/xc_domain.c            |   9 +-
 tools/tests/Makefile                   |  12 +-
 tools/tests/mem-claim/.gitignore       |   1 +
 tools/tests/mem-claim/Makefile         |  38 +++++
 tools/tests/mem-claim/test-mem-claim.c | 190 +++++++++++++++++++++++++
 xen/common/memory.c                    |   3 +
 6 files changed, 240 insertions(+), 13 deletions(-)
 create mode 100644 tools/tests/mem-claim/.gitignore
 create mode 100644 tools/tests/mem-claim/Makefile
 create mode 100644 tools/tests/mem-claim/test-mem-claim.c


base-commit: 46f3ed0d53db6daf38c230dff0d2910bcb61fbe2
-- 
2.39.5



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains
  2025-12-16 16:32 [PATCH 0/4] xen: Memory claims fixes and testing Andrew Cooper
@ 2025-12-16 16:32 ` Andrew Cooper
  2025-12-17  8:00   ` Jan Beulich
  2025-12-16 16:32 ` [PATCH 2/4] tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages() Andrew Cooper
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Andrew Cooper @ 2025-12-16 16:32 UTC (permalink / raw)
  To: Xen-devel
  Cc: Andrew Cooper, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Roger Pau Monné, Stefano Stabellini

XENMEM_claim_pages can be issued on a domain in the later stages of
domain_kill().  In that case, the claimed memory is leaked, as there's no way
to subsequently release the claim.

Claims are intended for use during domain construction; to reserve sufficient
RAM to construct the domain fully.  There's no legitimate reason to be calling
it on a dying domain.

Fixes: 65c9792df600 ("mmu: Introduce XENMEM_claim_pages (subop of memory ops)")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Julien Grall <julien@xen.org>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
---
 xen/common/memory.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/xen/common/memory.c b/xen/common/memory.c
index 3688e6dd5032..ae805ccbe4d1 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -1681,6 +1681,9 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 
         rc = xsm_claim_pages(XSM_PRIV, d);
 
+        if ( !rc && d->is_dying )
+            rc = -EINVAL;
+
         if ( !rc )
             rc = domain_set_outstanding_pages(d, reservation.nr_extents);
 
-- 
2.39.5



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages()
  2025-12-16 16:32 [PATCH 0/4] xen: Memory claims fixes and testing Andrew Cooper
  2025-12-16 16:32 ` [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains Andrew Cooper
@ 2025-12-16 16:32 ` Andrew Cooper
  2025-12-17 16:29   ` Roger Pau Monné
  2025-12-16 16:32 ` [PATCH 3/4] tools/tests: Sort Makefile Andrew Cooper
  2025-12-16 16:32 ` [PATCH 4/4] tools/tests: Memory Claims Andrew Cooper
  3 siblings, 1 reply; 10+ messages in thread
From: Andrew Cooper @ 2025-12-16 16:32 UTC (permalink / raw)
  To: Xen-devel
  Cc: Andrew Cooper, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Roger Pau Monné, Stefano Stabellini

It's not acceptable to hide this from the caller; the effect of doing so is to
break an atomicity expectation.

Only the caller can know what the appropriate safety action is in the case
that the claim hypercall isn't available.

Fixes: fc67e9dc0c1f ("xc: use XENMEM_claim_pages hypercall during guest creation.")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Julien Grall <julien@xen.org>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
---
 tools/libs/ctrl/xc_domain.c | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/tools/libs/ctrl/xc_domain.c b/tools/libs/ctrl/xc_domain.c
index 2ddc3f4f426d..01c0669c8863 100644
--- a/tools/libs/ctrl/xc_domain.c
+++ b/tools/libs/ctrl/xc_domain.c
@@ -1074,7 +1074,6 @@ int xc_domain_claim_pages(xc_interface *xch,
                                uint32_t domid,
                                unsigned long nr_pages)
 {
-    int err;
     struct xen_memory_reservation reservation = {
         .nr_extents   = nr_pages,
         .extent_order = 0,
@@ -1082,13 +1081,7 @@ int xc_domain_claim_pages(xc_interface *xch,
         .domid        = domid
     };
 
-    set_xen_guest_handle(reservation.extent_start, HYPERCALL_BUFFER_NULL);
-
-    err = xc_memory_op(xch, XENMEM_claim_pages, &reservation, sizeof(reservation));
-    /* Ignore it if the hypervisor does not support the call. */
-    if (err == -1 && errno == ENOSYS)
-        err = errno = 0;
-    return err;
+    return xc_memory_op(xch, XENMEM_claim_pages, &reservation, sizeof(reservation));
 }
 
 int xc_domain_populate_physmap(xc_interface *xch,
-- 
2.39.5



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] tools/tests: Sort Makefile
  2025-12-16 16:32 [PATCH 0/4] xen: Memory claims fixes and testing Andrew Cooper
  2025-12-16 16:32 ` [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains Andrew Cooper
  2025-12-16 16:32 ` [PATCH 2/4] tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages() Andrew Cooper
@ 2025-12-16 16:32 ` Andrew Cooper
  2025-12-17 16:30   ` Roger Pau Monné
  2025-12-16 16:32 ` [PATCH 4/4] tools/tests: Memory Claims Andrew Cooper
  3 siblings, 1 reply; 10+ messages in thread
From: Andrew Cooper @ 2025-12-16 16:32 UTC (permalink / raw)
  To: Xen-devel
  Cc: Andrew Cooper, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Roger Pau Monné, Stefano Stabellini

... and split the x86 group away from the common group.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Julien Grall <julien@xen.org>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
---
 tools/tests/Makefile | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/tools/tests/Makefile b/tools/tests/Makefile
index ac5737364623..e566bd169952 100644
--- a/tools/tests/Makefile
+++ b/tools/tests/Makefile
@@ -3,17 +3,18 @@ include $(XEN_ROOT)/tools/Rules.mk
 
 SUBDIRS-y :=
 SUBDIRS-y += domid
+SUBDIRS-y += paging-mempool
+SUBDIRS-y += pdx
+SUBDIRS-y += rangeset
 SUBDIRS-y += resource
+SUBDIRS-y += vpci
+SUBDIRS-y += xenstore
+
 SUBDIRS-$(CONFIG_X86) += cpu-policy
 SUBDIRS-$(CONFIG_X86) += tsx
 ifneq ($(clang),y)
 SUBDIRS-$(CONFIG_X86) += x86_emulator
 endif
-SUBDIRS-y += xenstore
-SUBDIRS-y += pdx
-SUBDIRS-y += rangeset
-SUBDIRS-y += vpci
-SUBDIRS-y += paging-mempool
 
 .PHONY: all clean install distclean uninstall
 all clean distclean install uninstall: %: subdirs-%
-- 
2.39.5



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] tools/tests: Memory Claims
  2025-12-16 16:32 [PATCH 0/4] xen: Memory claims fixes and testing Andrew Cooper
                   ` (2 preceding siblings ...)
  2025-12-16 16:32 ` [PATCH 3/4] tools/tests: Sort Makefile Andrew Cooper
@ 2025-12-16 16:32 ` Andrew Cooper
  2025-12-17 17:01   ` Roger Pau Monné
  3 siblings, 1 reply; 10+ messages in thread
From: Andrew Cooper @ 2025-12-16 16:32 UTC (permalink / raw)
  To: Xen-devel
  Cc: Andrew Cooper, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Roger Pau Monné, Stefano Stabellini

Add some basic testing of the memory claims mechainsm.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Anthony PERARD <anthony.perard@vates.tech>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Jan Beulich <jbeulich@suse.com>
CC: Julien Grall <julien@xen.org>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
---
 tools/tests/Makefile                   |   1 +
 tools/tests/mem-claim/.gitignore       |   1 +
 tools/tests/mem-claim/Makefile         |  38 +++++
 tools/tests/mem-claim/test-mem-claim.c | 190 +++++++++++++++++++++++++
 4 files changed, 230 insertions(+)
 create mode 100644 tools/tests/mem-claim/.gitignore
 create mode 100644 tools/tests/mem-claim/Makefile
 create mode 100644 tools/tests/mem-claim/test-mem-claim.c

diff --git a/tools/tests/Makefile b/tools/tests/Makefile
index e566bd169952..6477a4386dda 100644
--- a/tools/tests/Makefile
+++ b/tools/tests/Makefile
@@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 
 SUBDIRS-y :=
 SUBDIRS-y += domid
+SUBDIRS-y += mem-claim
 SUBDIRS-y += paging-mempool
 SUBDIRS-y += pdx
 SUBDIRS-y += rangeset
diff --git a/tools/tests/mem-claim/.gitignore b/tools/tests/mem-claim/.gitignore
new file mode 100644
index 000000000000..cfcee00b819b
--- /dev/null
+++ b/tools/tests/mem-claim/.gitignore
@@ -0,0 +1 @@
+test-mem-claim
diff --git a/tools/tests/mem-claim/Makefile b/tools/tests/mem-claim/Makefile
new file mode 100644
index 000000000000..76ba3e3c8bef
--- /dev/null
+++ b/tools/tests/mem-claim/Makefile
@@ -0,0 +1,38 @@
+XEN_ROOT = $(CURDIR)/../../..
+include $(XEN_ROOT)/tools/Rules.mk
+
+TARGET := test-mem-claim
+
+.PHONY: all
+all: $(TARGET)
+
+.PHONY: clean
+clean:
+	$(RM) -- *.o $(TARGET) $(DEPS_RM)
+
+.PHONY: distclean
+distclean: clean
+	$(RM) -- *~
+
+.PHONY: install
+install: all
+	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests
+	$(INSTALL_PROG) $(TARGET) $(DESTDIR)$(LIBEXEC)/tests
+
+.PHONY: uninstall
+uninstall:
+	$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$(TARGET)
+
+CFLAGS += $(CFLAGS_xeninclude)
+CFLAGS += $(CFLAGS_libxenctrl)
+CFLAGS += $(APPEND_CFLAGS)
+
+LDFLAGS += $(LDLIBS_libxenctrl)
+LDFLAGS += $(APPEND_LDFLAGS)
+
+%.o: Makefile
+
+$(TARGET): test-mem-claim.o
+	$(CC) -o $@ $< $(LDFLAGS)
+
+-include $(DEPS_INCLUDE)
diff --git a/tools/tests/mem-claim/test-mem-claim.c b/tools/tests/mem-claim/test-mem-claim.c
new file mode 100644
index 000000000000..78eae9091f52
--- /dev/null
+++ b/tools/tests/mem-claim/test-mem-claim.c
@@ -0,0 +1,190 @@
+#include <err.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/mman.h>
+
+#include <xenctrl.h>
+#include <xenforeignmemory.h>
+#include <xengnttab.h>
+#include <xen-tools/common-macros.h>
+
+static unsigned int nr_failures;
+#define fail(fmt, ...)                          \
+({                                              \
+    nr_failures++;                              \
+    (void)printf(fmt, ##__VA_ARGS__);           \
+})
+
+static xc_interface *xch;
+static uint32_t domid = -1;
+
+static xc_physinfo_t physinfo;
+
+static struct xen_domctl_createdomain create = {
+    .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap,
+    .max_vcpus = 1,
+    .max_grant_frames = 1,
+    .grant_opts = XEN_DOMCTL_GRANT_version(1),
+
+    .arch = {
+#if defined(__x86_64__) || defined(__i386__)
+        .emulation_flags = XEN_X86_EMU_LAPIC,
+#endif
+    },
+};
+
+static void run_tests(void)
+{
+    int rc;
+
+    /*
+     * Check that the system is quiescent.  Outstanding claims is a global
+     * field.
+     */
+    rc = xc_physinfo(xch, &physinfo);
+    if ( rc )
+        return fail("Failed to obtain physinfo: %d - %s\n",
+                    errno, strerror(errno));
+
+    printf("Free pages: %"PRIu64", Oustanding claims: %"PRIu64"\n",
+           physinfo.free_pages, physinfo.outstanding_pages);
+
+    if ( physinfo.outstanding_pages )
+        return fail("  Test needs running on a quiescent system\n");
+
+    /*
+     * We want any arbitrary domain.  Start with HVM/HAP, falling back to
+     * HVM/Shadow and then to PV.  The dom0 running this test case is one of
+     * these modes.
+     */
+#if defined(__x86_64__) || defined(__i386__)
+    if ( !(physinfo.capabilities & XEN_SYSCTL_PHYSCAP_hap) )
+        create.flags &= ~XEN_DOMCTL_CDF_hap;
+
+    if ( !(physinfo.capabilities & (XEN_SYSCTL_PHYSCAP_hap|XEN_SYSCTL_PHYSCAP_shadow)) ||
+         !(physinfo.capabilities & XEN_SYSCTL_PHYSCAP_hvm) )
+    {
+        create.flags &= ~XEN_DOMCTL_CDF_hvm;
+        create.arch.emulation_flags = 0;
+    }
+#endif
+
+    rc = xc_domain_create(xch, &domid, &create);
+    if ( rc )
+        return fail("  Domain create failure: %d - %s\n",
+                    errno, strerror(errno));
+
+    rc = xc_domain_setmaxmem(xch, domid, -1);
+    if ( rc )
+        return fail("  Failed to set maxmem: %d - %s\n",
+                    errno, strerror(errno));
+
+    printf("  Created d%u\n", domid);
+
+    /*
+     * Creating a domain shouldn't change the claim.  Check it's still 0.
+     */
+    rc = xc_physinfo(xch, &physinfo);
+    if ( rc )
+        return fail("  Failed to obtain physinfo: %d - %s\n",
+                    errno, strerror(errno));
+
+    if ( physinfo.outstanding_pages )
+        return fail("  Unexpected outstanding claim of %"PRIu64" pages\n",
+                    physinfo.outstanding_pages);
+
+    /*
+     * Set a claim for 4M.  This should be the only claim in the system, and
+     * show up globally.
+     */
+    rc = xc_domain_claim_pages(xch, domid, 4*1024*1024/4096);
+    if ( rc )
+        return fail("  Failed to claim 4M of RAM: %d - %s\n",
+                    errno, strerror(errno));
+
+    rc = xc_physinfo(xch, &physinfo);
+    if ( rc )
+        return fail("  Failed to obtain physinfo: %d - %s\n",
+                    errno, strerror(errno));
+
+    if ( physinfo.outstanding_pages != 4*1024*1024/4096 )
+        return fail("  Expected claim to be 4M, got %"PRIu64" pages\n",
+                    physinfo.outstanding_pages);
+
+    /*
+     * Allocate 2M of RAM to the domain.  This should be deducted from global
+     * claim.
+     */
+    xen_pfn_t ram[] = { 0 };
+    rc = xc_domain_populate_physmap_exact(
+        xch, domid, ARRAY_SIZE(ram), 9, 0, ram);
+    if ( rc )
+        return fail("  Failed to populate physmap domain: %d - %s\n",
+                    errno, strerror(errno));
+
+    rc = xc_physinfo(xch, &physinfo);
+    if ( rc )
+        return fail("  Failed to obtain physinfo: %d - %s\n",
+                    errno, strerror(errno));
+
+    if ( physinfo.outstanding_pages != 2*1024*1024/4096 )
+        return fail("  Expected claim to be 2M, got %"PRIu64" pages\n",
+                    physinfo.outstanding_pages);
+
+    /*
+     * Destroying the domain should release the outstanding 2M claim.
+     */
+    rc = xc_domain_destroy(xch, domid);
+
+    /* Cancel the cleanup path, even in the case of an error. */
+    domid = -1;
+
+    if ( rc )
+        return fail("  Failed to destroy domain: %d - %s\n",
+                    errno, strerror(errno));
+
+    rc = xc_physinfo(xch, &physinfo);
+    if ( rc )
+        return fail("  Failed to obtain physinfo: %d - %s\n",
+                    errno, strerror(errno));
+
+    if ( physinfo.outstanding_pages )
+        return fail("  Expected no outstanding claim, got %"PRIu64" pages\n",
+                    physinfo.outstanding_pages);
+}
+
+int main(int argc, char **argv)
+{
+    int rc;
+
+    printf("Memory claims tests\n");
+
+    xch = xc_interface_open(NULL, NULL, 0);
+
+    if ( !xch )
+        err(1, "xc_interface_open");
+
+    run_tests();
+
+    if ( (int)domid >= 0 )
+    {
+        rc = xc_domain_destroy(xch, domid);
+        if ( rc )
+            fail("  Failed to destroy domain: %d - %s\n",
+                 errno, strerror(errno));
+    }
+
+    return !!nr_failures;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
-- 
2.39.5



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains
  2025-12-16 16:32 ` [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains Andrew Cooper
@ 2025-12-17  8:00   ` Jan Beulich
  0 siblings, 0 replies; 10+ messages in thread
From: Jan Beulich @ 2025-12-17  8:00 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: Anthony PERARD, Michal Orzel, Julien Grall, Roger Pau Monné,
	Stefano Stabellini, Xen-devel

On 16.12.2025 17:32, Andrew Cooper wrote:
> XENMEM_claim_pages can be issued on a domain in the later stages of
> domain_kill().  In that case, the claimed memory is leaked, as there's no way
> to subsequently release the claim.
> 
> Claims are intended for use during domain construction; to reserve sufficient
> RAM to construct the domain fully.  There's no legitimate reason to be calling
> it on a dying domain.
> 
> Fixes: 65c9792df600 ("mmu: Introduce XENMEM_claim_pages (subop of memory ops)")
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Jan Beulich <jbeulich@suse.com>



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages()
  2025-12-16 16:32 ` [PATCH 2/4] tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages() Andrew Cooper
@ 2025-12-17 16:29   ` Roger Pau Monné
  0 siblings, 0 replies; 10+ messages in thread
From: Roger Pau Monné @ 2025-12-17 16:29 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: Xen-devel, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Stefano Stabellini

On Tue, Dec 16, 2025 at 04:32:28PM +0000, Andrew Cooper wrote:
> It's not acceptable to hide this from the caller; the effect of doing so is to
> break an atomicity expectation.
> 
> Only the caller can know what the appropriate safety action is in the case
> that the claim hypercall isn't available.
> 
> Fixes: fc67e9dc0c1f ("xc: use XENMEM_claim_pages hypercall during guest creation.")
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Thanks, Roger.


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] tools/tests: Sort Makefile
  2025-12-16 16:32 ` [PATCH 3/4] tools/tests: Sort Makefile Andrew Cooper
@ 2025-12-17 16:30   ` Roger Pau Monné
  0 siblings, 0 replies; 10+ messages in thread
From: Roger Pau Monné @ 2025-12-17 16:30 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: Xen-devel, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Stefano Stabellini

On Tue, Dec 16, 2025 at 04:32:29PM +0000, Andrew Cooper wrote:
> ... and split the x86 group away from the common group.
> 
> No functional change.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Thanks, Roger.


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] tools/tests: Memory Claims
  2025-12-16 16:32 ` [PATCH 4/4] tools/tests: Memory Claims Andrew Cooper
@ 2025-12-17 17:01   ` Roger Pau Monné
  2025-12-17 17:22     ` Andrew Cooper
  0 siblings, 1 reply; 10+ messages in thread
From: Roger Pau Monné @ 2025-12-17 17:01 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: Xen-devel, Anthony PERARD, Michal Orzel, Jan Beulich,
	Julien Grall, Stefano Stabellini

On Tue, Dec 16, 2025 at 04:32:30PM +0000, Andrew Cooper wrote:
> Add some basic testing of the memory claims mechainsm.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Some nits below.

> ---
> CC: Anthony PERARD <anthony.perard@vates.tech>
> CC: Michal Orzel <michal.orzel@amd.com>
> CC: Jan Beulich <jbeulich@suse.com>
> CC: Julien Grall <julien@xen.org>
> CC: Roger Pau Monné <roger.pau@citrix.com>
> CC: Stefano Stabellini <sstabellini@kernel.org>
> ---
>  tools/tests/Makefile                   |   1 +
>  tools/tests/mem-claim/.gitignore       |   1 +
>  tools/tests/mem-claim/Makefile         |  38 +++++
>  tools/tests/mem-claim/test-mem-claim.c | 190 +++++++++++++++++++++++++
>  4 files changed, 230 insertions(+)
>  create mode 100644 tools/tests/mem-claim/.gitignore
>  create mode 100644 tools/tests/mem-claim/Makefile
>  create mode 100644 tools/tests/mem-claim/test-mem-claim.c
> 
> diff --git a/tools/tests/Makefile b/tools/tests/Makefile
> index e566bd169952..6477a4386dda 100644
> --- a/tools/tests/Makefile
> +++ b/tools/tests/Makefile
> @@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
>  
>  SUBDIRS-y :=
>  SUBDIRS-y += domid
> +SUBDIRS-y += mem-claim
>  SUBDIRS-y += paging-mempool
>  SUBDIRS-y += pdx
>  SUBDIRS-y += rangeset
> diff --git a/tools/tests/mem-claim/.gitignore b/tools/tests/mem-claim/.gitignore
> new file mode 100644
> index 000000000000..cfcee00b819b
> --- /dev/null
> +++ b/tools/tests/mem-claim/.gitignore
> @@ -0,0 +1 @@
> +test-mem-claim
> diff --git a/tools/tests/mem-claim/Makefile b/tools/tests/mem-claim/Makefile
> new file mode 100644
> index 000000000000..76ba3e3c8bef
> --- /dev/null
> +++ b/tools/tests/mem-claim/Makefile
> @@ -0,0 +1,38 @@
> +XEN_ROOT = $(CURDIR)/../../..
> +include $(XEN_ROOT)/tools/Rules.mk
> +
> +TARGET := test-mem-claim
> +
> +.PHONY: all
> +all: $(TARGET)
> +
> +.PHONY: clean
> +clean:
> +	$(RM) -- *.o $(TARGET) $(DEPS_RM)
> +
> +.PHONY: distclean
> +distclean: clean
> +	$(RM) -- *~
> +
> +.PHONY: install
> +install: all
> +	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests
> +	$(INSTALL_PROG) $(TARGET) $(DESTDIR)$(LIBEXEC)/tests
> +
> +.PHONY: uninstall
> +uninstall:
> +	$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$(TARGET)
> +
> +CFLAGS += $(CFLAGS_xeninclude)
> +CFLAGS += $(CFLAGS_libxenctrl)
> +CFLAGS += $(APPEND_CFLAGS)
> +
> +LDFLAGS += $(LDLIBS_libxenctrl)
> +LDFLAGS += $(APPEND_LDFLAGS)
> +
> +%.o: Makefile
> +
> +$(TARGET): test-mem-claim.o
> +	$(CC) -o $@ $< $(LDFLAGS)
> +
> +-include $(DEPS_INCLUDE)
> diff --git a/tools/tests/mem-claim/test-mem-claim.c b/tools/tests/mem-claim/test-mem-claim.c
> new file mode 100644
> index 000000000000..78eae9091f52
> --- /dev/null
> +++ b/tools/tests/mem-claim/test-mem-claim.c
> @@ -0,0 +1,190 @@

SPDX header comment?

> +#include <err.h>
> +#include <errno.h>
> +#include <inttypes.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <sys/mman.h>
> +
> +#include <xenctrl.h>
> +#include <xenforeignmemory.h>
> +#include <xengnttab.h>
> +#include <xen-tools/common-macros.h>
> +
> +static unsigned int nr_failures;
> +#define fail(fmt, ...)                          \
> +({                                              \
> +    nr_failures++;                              \
> +    (void)printf(fmt, ##__VA_ARGS__);           \
> +})
> +
> +static xc_interface *xch;
> +static uint32_t domid = -1;

I think you could use domid_t and DOMID_INVALID as the default value?

And then you could avoid the casting and just use domid <
DOMID_FIRST_RESERVED as the check for whether the cleanup is needed?

> +
> +static xc_physinfo_t physinfo;
> +
> +static struct xen_domctl_createdomain create = {
> +    .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap,
> +    .max_vcpus = 1,
> +    .max_grant_frames = 1,
> +    .grant_opts = XEN_DOMCTL_GRANT_version(1),
> +
> +    .arch = {
> +#if defined(__x86_64__) || defined(__i386__)
> +        .emulation_flags = XEN_X86_EMU_LAPIC,
> +#endif
> +    },
> +};
> +
> +static void run_tests(void)
> +{
> +    int rc;
> +
> +    /*
> +     * Check that the system is quiescent.  Outstanding claims is a global
> +     * field.
> +     */
> +    rc = xc_physinfo(xch, &physinfo);
> +    if ( rc )
> +        return fail("Failed to obtain physinfo: %d - %s\n",
> +                    errno, strerror(errno));
> +
> +    printf("Free pages: %"PRIu64", Oustanding claims: %"PRIu64"\n",
> +           physinfo.free_pages, physinfo.outstanding_pages);
> +
> +    if ( physinfo.outstanding_pages )
> +        return fail("  Test needs running on a quiescent system\n");
> +
> +    /*
> +     * We want any arbitrary domain.  Start with HVM/HAP, falling back to
> +     * HVM/Shadow and then to PV.  The dom0 running this test case is one of
> +     * these modes.
> +     */
> +#if defined(__x86_64__) || defined(__i386__)
> +    if ( !(physinfo.capabilities & XEN_SYSCTL_PHYSCAP_hap) )
> +        create.flags &= ~XEN_DOMCTL_CDF_hap;
> +
> +    if ( !(physinfo.capabilities & (XEN_SYSCTL_PHYSCAP_hap|XEN_SYSCTL_PHYSCAP_shadow)) ||
> +         !(physinfo.capabilities & XEN_SYSCTL_PHYSCAP_hvm) )
> +    {
> +        create.flags &= ~XEN_DOMCTL_CDF_hvm;
> +        create.arch.emulation_flags = 0;
> +    }
> +#endif
> +
> +    rc = xc_domain_create(xch, &domid, &create);
> +    if ( rc )
> +        return fail("  Domain create failure: %d - %s\n",
> +                    errno, strerror(errno));
> +
> +    rc = xc_domain_setmaxmem(xch, domid, -1);
> +    if ( rc )
> +        return fail("  Failed to set maxmem: %d - %s\n",
> +                    errno, strerror(errno));
> +
> +    printf("  Created d%u\n", domid);
> +
> +    /*
> +     * Creating a domain shouldn't change the claim.  Check it's still 0.
> +     */
> +    rc = xc_physinfo(xch, &physinfo);
> +    if ( rc )
> +        return fail("  Failed to obtain physinfo: %d - %s\n",
> +                    errno, strerror(errno));
> +
> +    if ( physinfo.outstanding_pages )
> +        return fail("  Unexpected outstanding claim of %"PRIu64" pages\n",
> +                    physinfo.outstanding_pages);
> +
> +    /*
> +     * Set a claim for 4M.  This should be the only claim in the system, and
> +     * show up globally.
> +     */
> +    rc = xc_domain_claim_pages(xch, domid, 4*1024*1024/4096);

You can use MB(4) (macro is in tools/common-macros.h) I think for
clarity?  Same below with MB(2).

Thanks, Roger.


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] tools/tests: Memory Claims
  2025-12-17 17:01   ` Roger Pau Monné
@ 2025-12-17 17:22     ` Andrew Cooper
  0 siblings, 0 replies; 10+ messages in thread
From: Andrew Cooper @ 2025-12-17 17:22 UTC (permalink / raw)
  To: Roger Pau Monné
  Cc: Andrew Cooper, Xen-devel, Anthony PERARD, Michal Orzel,
	Jan Beulich, Julien Grall, Stefano Stabellini

On 17/12/2025 5:01 pm, Roger Pau Monné wrote:
> On Tue, Dec 16, 2025 at 04:32:30PM +0000, Andrew Cooper wrote:
>> Add some basic testing of the memory claims mechainsm.
>>
>> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>

Thanks.

> Some nits below.
>
>> ---
>> CC: Anthony PERARD <anthony.perard@vates.tech>
>> CC: Michal Orzel <michal.orzel@amd.com>
>> CC: Jan Beulich <jbeulich@suse.com>
>> CC: Julien Grall <julien@xen.org>
>> CC: Roger Pau Monné <roger.pau@citrix.com>
>> CC: Stefano Stabellini <sstabellini@kernel.org>
>> ---
>>  tools/tests/Makefile                   |   1 +
>>  tools/tests/mem-claim/.gitignore       |   1 +
>>  tools/tests/mem-claim/Makefile         |  38 +++++
>>  tools/tests/mem-claim/test-mem-claim.c | 190 +++++++++++++++++++++++++
>>  4 files changed, 230 insertions(+)
>>  create mode 100644 tools/tests/mem-claim/.gitignore
>>  create mode 100644 tools/tests/mem-claim/Makefile
>>  create mode 100644 tools/tests/mem-claim/test-mem-claim.c
>>
>> diff --git a/tools/tests/Makefile b/tools/tests/Makefile
>> index e566bd169952..6477a4386dda 100644
>> --- a/tools/tests/Makefile
>> +++ b/tools/tests/Makefile
>> @@ -3,6 +3,7 @@ include $(XEN_ROOT)/tools/Rules.mk
>>  
>>  SUBDIRS-y :=
>>  SUBDIRS-y += domid
>> +SUBDIRS-y += mem-claim
>>  SUBDIRS-y += paging-mempool
>>  SUBDIRS-y += pdx
>>  SUBDIRS-y += rangeset
>> diff --git a/tools/tests/mem-claim/.gitignore b/tools/tests/mem-claim/.gitignore
>> new file mode 100644
>> index 000000000000..cfcee00b819b
>> --- /dev/null
>> +++ b/tools/tests/mem-claim/.gitignore
>> @@ -0,0 +1 @@
>> +test-mem-claim
>> diff --git a/tools/tests/mem-claim/Makefile b/tools/tests/mem-claim/Makefile
>> new file mode 100644
>> index 000000000000..76ba3e3c8bef
>> --- /dev/null
>> +++ b/tools/tests/mem-claim/Makefile
>> @@ -0,0 +1,38 @@
>> +XEN_ROOT = $(CURDIR)/../../..
>> +include $(XEN_ROOT)/tools/Rules.mk
>> +
>> +TARGET := test-mem-claim
>> +
>> +.PHONY: all
>> +all: $(TARGET)
>> +
>> +.PHONY: clean
>> +clean:
>> +	$(RM) -- *.o $(TARGET) $(DEPS_RM)
>> +
>> +.PHONY: distclean
>> +distclean: clean
>> +	$(RM) -- *~
>> +
>> +.PHONY: install
>> +install: all
>> +	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)/tests
>> +	$(INSTALL_PROG) $(TARGET) $(DESTDIR)$(LIBEXEC)/tests
>> +
>> +.PHONY: uninstall
>> +uninstall:
>> +	$(RM) -- $(DESTDIR)$(LIBEXEC)/tests/$(TARGET)
>> +
>> +CFLAGS += $(CFLAGS_xeninclude)
>> +CFLAGS += $(CFLAGS_libxenctrl)
>> +CFLAGS += $(APPEND_CFLAGS)
>> +
>> +LDFLAGS += $(LDLIBS_libxenctrl)
>> +LDFLAGS += $(APPEND_LDFLAGS)
>> +
>> +%.o: Makefile
>> +
>> +$(TARGET): test-mem-claim.o
>> +	$(CC) -o $@ $< $(LDFLAGS)
>> +
>> +-include $(DEPS_INCLUDE)
>> diff --git a/tools/tests/mem-claim/test-mem-claim.c b/tools/tests/mem-claim/test-mem-claim.c
>> new file mode 100644
>> index 000000000000..78eae9091f52
>> --- /dev/null
>> +++ b/tools/tests/mem-claim/test-mem-claim.c
>> @@ -0,0 +1,190 @@
> SPDX header comment?

Will do.

>
>> +#include <err.h>
>> +#include <errno.h>
>> +#include <inttypes.h>
>> +#include <stdio.h>
>> +#include <string.h>
>> +#include <sys/mman.h>
>> +
>> +#include <xenctrl.h>
>> +#include <xenforeignmemory.h>
>> +#include <xengnttab.h>
>> +#include <xen-tools/common-macros.h>
>> +
>> +static unsigned int nr_failures;
>> +#define fail(fmt, ...)                          \
>> +({                                              \
>> +    nr_failures++;                              \
>> +    (void)printf(fmt, ##__VA_ARGS__);           \
>> +})
>> +
>> +static xc_interface *xch;
>> +static uint32_t domid = -1;
> I think you could use domid_t and DOMID_INVALID as the default value?

Sadly can't.  Domid's are strictly uint32_t due to xc_domain_create()
taking it by pointer.

> And then you could avoid the casting and just use domid <
> DOMID_FIRST_RESERVED as the check for whether the cleanup is needed?

Hmm.  The DOMID_INVALID part of that is nice-ish, but having the
boundary check be a different constant isn't.

Maybe I can just do != DOMID_INVALID for the cleanup.

>
>> +
>> +static xc_physinfo_t physinfo;
>> +
>> +static struct xen_domctl_createdomain create = {
>> +    .flags = XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap,
>> +    .max_vcpus = 1,
>> +    .max_grant_frames = 1,
>> +    .grant_opts = XEN_DOMCTL_GRANT_version(1),
>> +
>> +    .arch = {
>> +#if defined(__x86_64__) || defined(__i386__)
>> +        .emulation_flags = XEN_X86_EMU_LAPIC,
>> +#endif
>> +    },
>> +};
>> +
>> +static void run_tests(void)
>> +{
>> +    int rc;
>> +
>> +    /*
>> +     * Check that the system is quiescent.  Outstanding claims is a global
>> +     * field.
>> +     */
>> +    rc = xc_physinfo(xch, &physinfo);
>> +    if ( rc )
>> +        return fail("Failed to obtain physinfo: %d - %s\n",
>> +                    errno, strerror(errno));
>> +
>> +    printf("Free pages: %"PRIu64", Oustanding claims: %"PRIu64"\n",
>> +           physinfo.free_pages, physinfo.outstanding_pages);
>> +
>> +    if ( physinfo.outstanding_pages )
>> +        return fail("  Test needs running on a quiescent system\n");
>> +
>> +    /*
>> +     * We want any arbitrary domain.  Start with HVM/HAP, falling back to
>> +     * HVM/Shadow and then to PV.  The dom0 running this test case is one of
>> +     * these modes.
>> +     */
>> +#if defined(__x86_64__) || defined(__i386__)
>> +    if ( !(physinfo.capabilities & XEN_SYSCTL_PHYSCAP_hap) )
>> +        create.flags &= ~XEN_DOMCTL_CDF_hap;
>> +
>> +    if ( !(physinfo.capabilities & (XEN_SYSCTL_PHYSCAP_hap|XEN_SYSCTL_PHYSCAP_shadow)) ||
>> +         !(physinfo.capabilities & XEN_SYSCTL_PHYSCAP_hvm) )
>> +    {
>> +        create.flags &= ~XEN_DOMCTL_CDF_hvm;
>> +        create.arch.emulation_flags = 0;
>> +    }
>> +#endif
>> +
>> +    rc = xc_domain_create(xch, &domid, &create);
>> +    if ( rc )
>> +        return fail("  Domain create failure: %d - %s\n",
>> +                    errno, strerror(errno));
>> +
>> +    rc = xc_domain_setmaxmem(xch, domid, -1);
>> +    if ( rc )
>> +        return fail("  Failed to set maxmem: %d - %s\n",
>> +                    errno, strerror(errno));
>> +
>> +    printf("  Created d%u\n", domid);
>> +
>> +    /*
>> +     * Creating a domain shouldn't change the claim.  Check it's still 0.
>> +     */
>> +    rc = xc_physinfo(xch, &physinfo);
>> +    if ( rc )
>> +        return fail("  Failed to obtain physinfo: %d - %s\n",
>> +                    errno, strerror(errno));
>> +
>> +    if ( physinfo.outstanding_pages )
>> +        return fail("  Unexpected outstanding claim of %"PRIu64" pages\n",
>> +                    physinfo.outstanding_pages);
>> +
>> +    /*
>> +     * Set a claim for 4M.  This should be the only claim in the system, and
>> +     * show up globally.
>> +     */
>> +    rc = xc_domain_claim_pages(xch, domid, 4*1024*1024/4096);
> You can use MB(4) (macro is in tools/common-macros.h) I think for
> clarity?  Same below with MB(2).

I'll wrap it as MB_TO_PAGES() to hide the divide by 4k.

~Andrew


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-12-17 17:22 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-16 16:32 [PATCH 0/4] xen: Memory claims fixes and testing Andrew Cooper
2025-12-16 16:32 ` [PATCH 1/4] xen/domain: Disallow XENMEM_claim_pages on dying domains Andrew Cooper
2025-12-17  8:00   ` Jan Beulich
2025-12-16 16:32 ` [PATCH 2/4] tools/libxc: Delete ENOSYS squashing in xc_domain_claim_pages() Andrew Cooper
2025-12-17 16:29   ` Roger Pau Monné
2025-12-16 16:32 ` [PATCH 3/4] tools/tests: Sort Makefile Andrew Cooper
2025-12-17 16:30   ` Roger Pau Monné
2025-12-16 16:32 ` [PATCH 4/4] tools/tests: Memory Claims Andrew Cooper
2025-12-17 17:01   ` Roger Pau Monné
2025-12-17 17:22     ` Andrew Cooper

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.