[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 11/15] libxl: refactor libxl_get_memory_target
Introduce a helper function which can return either "target" node or "static-max" node of a domain. Reimplement libxl_get_memory_target using this helper. libxl__fill_dom0_memory_info is adjusted as well. This helper will be used in later patch. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- change in v3: don't introduce new public function --- tools/libxl/libxl.c | 88 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 17 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 1fdb2d8..e2a956c 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4245,7 +4245,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; @@ -4279,6 +4280,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; @@ -4292,9 +4304,11 @@ retry_transaction: (uint32_t) info.current_memkb); *target_memkb = (uint32_t) info.current_memkb; } - if (staticmax == NULL) + if (staticmax == NULL) { libxl__xs_write(gc, t, max_path, "%"PRIu32, - (uint32_t) info.max_memkb); + (uint32_t) info.max_memkb); + *max_memkb = (uint32_t) info.max_memkb; + } if (freememslack == NULL) { free_mem_slack_kb = (uint32_t) (PAGE_TO_MEMKB(physinfo.total_pages) - @@ -4325,12 +4339,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; @@ -4353,6 +4367,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; @@ -4368,7 +4383,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; @@ -4483,38 +4499,76 @@ out_no_transaction: return rc; } -int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target) +/* bool get_target: + * true -> retrieve "target" node + * false -> retrieve "static-max" node + */ +static int libxl__get_memory_target(libxl__gc *gc, uint32_t domid, + uint32_t *out_mem, bool get_target) { - 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; + } + } - *out_target = target_memkb; + + if (!get_target) + *out_mem = max_memkb; + else + *out_mem = 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, true); + GC_FREE; return rc; } -- 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 |