diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 967f804037..c00e08fe2d 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2468,7 +2468,6 @@ int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t max_m char *mem, *endptr; uint32_t memorykb; char *dompath = libxl_xs_get_dompath(ctx, domid); - int rc; mem = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/memory/target", dompath)); if (!mem) { @@ -2486,20 +2485,16 @@ int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t max_m return 1; } - rc = xc_domain_setmaxmem(ctx->xch, domid, max_memkb); - if (rc != 0) - return rc; - if (domid != 0) libxl_xs_write(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/memory/static-max", dompath), "%lu", max_memkb); - return rc; + return 0; } -int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb) +int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb, int enforce) { int rc = 0; - uint32_t memorykb, videoram; + uint32_t memorykb = 0, videoram = 0; char *memmax, *endptr, *videoram_s = NULL; char *dompath = libxl_xs_get_dompath(ctx, domid); xc_domaininfo_t info; @@ -2539,6 +2534,11 @@ int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t targ uuid = libxl_uuid2string(ctx, ptr.uuid); libxl_xs_write(ctx, XBT_NULL, libxl_sprintf(ctx, "/vm/%s/memory", uuid), "%lu", target_memkb / 1024); + if (enforce || !domid) + memorykb = target_memkb; + rc = xc_domain_setmaxmem(ctx->xch, domid, memorykb + LIBXL_MAXMEM_CONSTANT); + if (rc != 0) + return rc; rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - videoram) / 4, NULL, NULL, NULL); return rc; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 130af2442d..e951111fcf 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -340,7 +340,7 @@ int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid); int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid); int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb); -int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb); +int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb, int enforce); int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index aa07996510..2101ee58d0 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1262,7 +1262,7 @@ void set_memory_target(char *p, char *mem) exit(3); } printf("setting domid %d memory to : %d\n", domid, memorykb); - libxl_set_memory_target(&ctx, domid, memorykb); + libxl_set_memory_target(&ctx, domid, memorykb, /* enforce */ 1); } int main_memset(int argc, char **argv)