[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 4/4] tools/tests: Memory Claims


  • To: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Wed, 17 Dec 2025 18:01:21 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=QWprsbrae4k2Jc0QPq+N/R775a76gPyxb9eyeNMn99A=; b=C+sr2tipgzAkr+SdlHWQv8lzmlEMB0/lBcrFPdxWFfFWkcRbHe11tK2JDsgPj7niMD6QEk3HBXNRWYEls2TU+ymdvBJpq/j8EzPXSrrs5Ou5BuJnICPmw9kK4rUY5jzkrNxhZhrGgfIJJuH620A4TEgFrNK1kI90yfgnC7ffcAV0jSkf2Wz4Fcc4JKG/Y9cyjv8AzJap+vAr5pHtiJ2jtNurK2y8ir/f/KIAurB2BUNmwwQYY5iUwE5Yk2DyHMu9cC107n0VbVewW4XWiuRkKr8KMfSraeMUHyRJFpYyLoMDrfSnDLVaN/fWiT49KcoLpWMugTl6bwr4sDk+q6YjjA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wP76MNYdnIcKPtrKitKyMkIISE2/drelfTr/Spbyh9LTxjl7Ug6yK3tGa7Fya5gm5MNwOdQpFRLYoBUOzXRKCezPNWGoQvdLw8fHZHNlfQdscz1wrT2JkiUvf3qUtXHRY2YBVdH9BffP8ZQlUIDvmLnhTO/FRhnNpz+i7b+fv3CMhHjnwsRaJ3ckV41Iog4q+JQWWhaw1S5Mw26ZD3yUGIIoD5ls9kLJgKy45KXXIzLLI+QcMfGEg5xiMbxjJJuKAT8qQ0sOIoBRcdwaSNODZsiqrEIAdqjgi7NzgJmFxZCqBRU44Acqum6pHwQXt6aWFl8Pbkh3OzznrnkHjxRFqg==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>
  • Delivery-date: Wed, 17 Dec 2025 17:01:36 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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@xxxxxxxxxx>

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

Some nits below.

> ---
> CC: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> CC: Michal Orzel <michal.orzel@xxxxxxx>
> CC: Jan Beulich <jbeulich@xxxxxxxx>
> CC: Julien Grall <julien@xxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
>  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.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.