[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 14/18] libxl: introduce libxl_get_memory_static_max
... which returns the "static-max" knob of a domain. It will be used in later patch to retrieve memory static-max value of a domain. As libxl_get_memory_{target,static_max} have similar, logic, a helper function is introduced to avoid code duplication. libxl__fill_dom0_memory_info is adjusted as needed. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/libxl/libxl.c | 93 ++++++++++++++++++++++++++++++++++++++++++--------- tools/libxl/libxl.h | 8 +++++ 2 files changed, 86 insertions(+), 15 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index d64d8f1..6083202 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4233,7 +4233,8 @@ out: return rc; } -static int libxl__fill_dom0_memory_info(libxl__gc *gc, uint32_t *target_memkb) +static int libxl__fill_dom0_memory_info(libxl__gc *gc, uint32_t *target_memkb, + uint32_t *max_memkb) { int rc; libxl_dominfo info; @@ -4267,6 +4268,17 @@ retry_transaction: } } + if (staticmax) { + *max_memkb = strtoul(staticmax, &endptr, 10); + if (*endptr != '\0') { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, + "invalid memory static-max %s from %s\n", + staticmax, max_path); + rc = ERROR_FAIL; + goto out; + } + } + rc = libxl_domain_info(ctx, &info, 0); if (rc < 0) goto out; @@ -4313,12 +4325,12 @@ static int libxl__get_free_memory_slack(libxl__gc *gc, uint32_t *free_mem_slack) int rc; char *free_mem_slack_path = "/local/domain/0/memory/freemem-slack"; char *free_mem_slack_s, *endptr; - uint32_t target_memkb; + uint32_t target_memkb, max_memkb; retry: free_mem_slack_s = libxl__xs_read(gc, XBT_NULL, free_mem_slack_path); if (!free_mem_slack_s) { - rc = libxl__fill_dom0_memory_info(gc, &target_memkb); + rc = libxl__fill_dom0_memory_info(gc, &target_memkb, &max_memkb); if (rc < 0) return rc; goto retry; @@ -4341,6 +4353,7 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, int rc = 1, abort_transaction = 0; uint32_t memorykb = 0, videoram = 0; uint32_t current_target_memkb = 0, new_target_memkb = 0; + uint32_t current_max_memkb = 0; char *memmax, *endptr, *videoram_s = NULL, *target = NULL; char *dompath = libxl__xs_get_dompath(gc, domid); xc_domaininfo_t info; @@ -4356,7 +4369,8 @@ retry_transaction: if (!target && !domid) { if (!xs_transaction_end(ctx->xsh, t, 1)) goto out_no_transaction; - rc = libxl__fill_dom0_memory_info(gc, ¤t_target_memkb); + rc = libxl__fill_dom0_memory_info(gc, ¤t_target_memkb, + ¤t_max_memkb); if (rc < 0) goto out_no_transaction; goto retry_transaction; @@ -4471,38 +4485,87 @@ out_no_transaction: return rc; } -int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target) +/* type determines which node to return: + * 1 "target" + * 2 "static-max" + */ +static int libxl__get_memory_target(libxl__gc *gc, uint32_t domid, + uint32_t *out_mem, int type) { - GC_INIT(ctx); - int rc = 1; - char *target = NULL, *endptr = NULL; + int rc; + char *target = NULL, *static_max = NULL, *endptr = NULL; char *dompath = libxl__xs_get_dompath(gc, domid); - uint32_t target_memkb; + uint32_t target_memkb, max_memkb; target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, - "%s/memory/target", dompath)); - if (!target && !domid) { - rc = libxl__fill_dom0_memory_info(gc, &target_memkb); + "%s/memory/target", dompath)); + static_max = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, + "%s/memory/static-max", dompath)); + + rc = ERROR_FAIL; + if ((!target || !static_max) && !domid) { + rc = libxl__fill_dom0_memory_info(gc, &target_memkb, + &max_memkb); if (rc < 0) goto out; } else if (!target) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, + LIBXL__LOG_ERRNO(CTX, LIBXL__LOG_ERROR, "cannot get target memory info from %s/memory/target\n", dompath); goto out; + } else if (!static_max) { + LIBXL__LOG_ERRNO(CTX, LIBXL__LOG_ERROR, + "cannot get target memory info from %s/memory/static-max\n", + dompath); + goto out; } else { target_memkb = strtoul(target, &endptr, 10); if (*endptr != '\0') { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, + LIBXL__LOG_ERRNO(CTX, LIBXL__LOG_ERROR, "invalid memory target %s from %s/memory/target\n", target, dompath); goto out; } + max_memkb = strtoul(static_max, &endptr, 10); + if (*endptr != '\0') { + LIBXL__LOG_ERRNO(CTX, LIBXL__LOG_ERROR, + "invalid memory target %s from %s/memory/static-max\n", + static_max, dompath); + goto out; + } + + } + switch (type) { + case 1: + *out_mem = target_memkb; break; + case 2: + *out_mem = max_memkb; break; } - *out_target = target_memkb; rc = 0; out: + return rc; +} + +int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target) +{ + GC_INIT(ctx); + int rc; + + rc = libxl__get_memory_target(gc, domid, out_target, 1); + + GC_FREE; + return rc; +} + +int libxl_get_memory_static_max(libxl_ctx *ctx, uint32_t domid, + uint32_t *out_static_max) +{ + GC_INIT(ctx); + int rc; + + rc = libxl__get_memory_target(gc, domid, out_static_max, 2); + GC_FREE; return rc; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 11e391d..7a0b58c 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -358,6 +358,13 @@ typedef struct libxl__ctx libxl_ctx; #endif #endif +/* LIBXL_HAVE_GET_MEMORY_STATIC_MAX + * + * If this is defined we have an API called libxl_get_memory_static_max + * to return the memory "static-max" value from xenstore. + */ +#define LIBXL_HAVE_GET_MEMORY_STATIC_MAX 1 + /* * LIBXL_HAVE_BUILDINFO_VCPU_AFFINITY_ARRAYS * @@ -884,6 +891,7 @@ int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid, int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb); int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, int32_t target_memkb, int relative, int enforce); int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target); +int libxl_get_memory_static_max(libxl_ctx *ctx, uint32_t domid, uint32_t *out_static_max); /* -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |