From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH v1 08/10] libxl: introduce libxl_get_memory_static_max Date: Thu, 10 Jul 2014 15:32:23 +0100 Message-ID: <1405002745-5034-9-git-send-email-wei.liu2@citrix.com> References: <1405002745-5034-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1405002745-5034-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , ian.jackson@eu.citrix.com, ian.campbell@citrix.com List-Id: xen-devel@lists.xenproject.org ... 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 macro is introduced to avoid code duplication. libxl__fill_dom0_memory_info is adjusted as needed. Signed-off-by: Wei Liu --- tools/libxl/libxl.c | 101 ++++++++++++++++++++++++++++++++------------------- tools/libxl/libxl.h | 8 ++++ 2 files changed, 72 insertions(+), 37 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 69d94b1..49d7ef6 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4187,7 +4187,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; @@ -4221,6 +4222,16 @@ 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; @@ -4267,12 +4278,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; @@ -4295,6 +4306,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; @@ -4310,7 +4322,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; @@ -4425,41 +4438,55 @@ out_no_transaction: return rc; } -int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target) -{ - GC_INIT(ctx); - int rc = 1; - char *target = NULL, *endptr = NULL; - char *dompath = libxl__xs_get_dompath(gc, domid); - uint32_t target_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); - if (rc < 0) - goto out; - } else if (!target) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, - "cannot get target memory info from %s/memory/target\n", - dompath); - goto out; - } else { - target_memkb = strtoul(target, &endptr, 10); - if (*endptr != '\0') { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, - "invalid memory target %s from %s/memory/target\n", - target, dompath); - goto out; - } +/* This macro generates: + * libxl_get_memory_target + * libxl_get_memory_static_max + */ +#define DEFINE_GET_MEMORY(name, node) \ + int libxl_get_memory_##name(libxl_ctx *ctx, uint32_t domid, \ + uint32_t *out) \ + { \ + GC_INIT(ctx); \ + int rc = 1; \ + char *val = NULL, *endptr = NULL; \ + char *dompath = libxl__xs_get_dompath(gc, domid); \ + uint32_t result; \ + uint32_t target, static_max; \ + \ + val = libxl__xs_read(gc, XBT_NULL, \ + libxl__sprintf(gc, "%s/memory/"node, \ + dompath)); \ + if (!val && !domid) { \ + rc = libxl__fill_dom0_memory_info(gc, &target, \ + &static_max); \ + if (rc < 0) \ + goto out; \ + result = name; \ + } else if (!val) { \ + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, \ + "cannot not get memory info from %s/memory/"node"\n", \ + dompath); \ + goto out; \ + } else { \ + result = strtoul(val, &endptr, 10); \ + if (*endptr != '\0') { \ + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, \ + "invalid value %s from %s/memory/"node"\n", \ + val, dompath); \ + goto out; \ + } \ + } \ + *out = result; \ + rc = 0; \ + \ + out: \ + GC_FREE; \ + return rc; \ } - *out_target = target_memkb; - rc = 0; -out: - GC_FREE; - return rc; -} +DEFINE_GET_MEMORY(target, "target") +DEFINE_GET_MEMORY(static_max, "static-max") +#undef DEFINE_GET_MEMORY int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info, uint32_t *need_memkb) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 2dc6a51..f9eb0f1 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 * @@ -886,6 +893,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_max_memkb); /* -- 1.7.10.4