diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in index b98d161398..eda1e77ebd 100644 --- a/docs/man/xl.cfg.5.pod.in +++ b/docs/man/xl.cfg.5.pod.in @@ -1768,6 +1768,11 @@ are not using hardware assisted paging (i.e. you are using shadow mode) and your guest workload consists of a very large number of similar processes then increasing this value may improve performance. +On Arm, this field is used to determine the size of the guest P2M pages +pool, and the default value is 1MB per vCPU plus 4KB per MB of RAM for +the P2M map and additional 512KB for extended regions. Users should +adjust this value if bigger P2M pool size is needed. + =back =head3 Processor and Platform Features diff --git a/tools/libs/light/libxl_arch.h b/tools/libs/light/libxl_arch.h index 1522ecb97f..5a060c2c30 100644 --- a/tools/libs/light/libxl_arch.h +++ b/tools/libs/light/libxl_arch.h @@ -90,6 +90,10 @@ void libxl__arch_update_domain_config(libxl__gc *gc, libxl_domain_config *dst, const libxl_domain_config *src); +_hidden +unsigned long libxl__arch_get_required_paging_memory(unsigned long maxmem_kb, + unsigned int smp_cpus); + #if defined(__i386__) || defined(__x86_64__) #define LAPIC_BASE_ADDRESS 0xfee00000 diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c index eef1de0939..73a95e83af 100644 --- a/tools/libs/light/libxl_arm.c +++ b/tools/libs/light/libxl_arm.c @@ -154,6 +154,20 @@ out: return rc; } +unsigned long libxl__arch_get_required_paging_memory(unsigned long maxmem_kb, + unsigned int smp_cpus) +{ + /* + * 256 pages (1MB) per vcpu, + * plus 1 page per MiB of RAM for the P2M map, + * plus 1 page per MiB of extended region. This default value is 128 MiB + * which should be enough for domains that are not running backend. + * This is higher than the minimum that Xen would allocate if no value + * were given (but the Xen minimum is for safety, not performance). + */ + return 4 * (256 * smp_cpus + maxmem_kb / 1024 + 128); +} + static struct arch_info { const char *guest_type; const char *timer_compat; diff --git a/tools/libs/light/libxl_utils.c b/tools/libs/light/libxl_utils.c index 4699c4a0a3..e276c0ee9c 100644 --- a/tools/libs/light/libxl_utils.c +++ b/tools/libs/light/libxl_utils.c @@ -18,6 +18,7 @@ #include #include "libxl_internal.h" +#include "libxl_arch.h" #include "_paths.h" #ifndef LIBXL_HAVE_NONCONST_LIBXL_BASENAME_RETURN_VALUE @@ -39,13 +40,7 @@ char *libxl_basename(const char *name) unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus) { - /* 256 pages (1MB) per vcpu, - plus 1 page per MiB of RAM for the P2M map, - plus 1 page per MiB of RAM to shadow the resident processes. - This is higher than the minimum that Xen would allocate if no value - were given (but the Xen minimum is for safety, not performance). - */ - return 4 * (256 * smp_cpus + 2 * (maxmem_kb / 1024)); + return libxl__arch_get_required_paging_memory(maxmem_kb, smp_cpus); } char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid) diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c index 1feadebb18..51362893cf 100644 --- a/tools/libs/light/libxl_x86.c +++ b/tools/libs/light/libxl_x86.c @@ -882,6 +882,19 @@ void libxl__arch_update_domain_config(libxl__gc *gc, libxl_defbool_val(src->b_info.arch_x86.msr_relaxed)); } +unsigned long libxl__arch_get_required_paging_memory(unsigned long maxmem_kb, + unsigned int smp_cpus) +{ + /* + * 256 pages (1MB) per vcpu, + * plus 1 page per MiB of RAM for the P2M map, + * plus 1 page per MiB of RAM to shadow the resident processes. + * This is higher than the minimum that Xen would allocate if no value + * were given (but the Xen minimum is for safety, not performance). + */ + return 4 * (256 * smp_cpus + 2 * (maxmem_kb / 1024)); +} + /* * Local variables: * mode: C