[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2 of 11] libxl: use transactions in libxl_set_memory_target
Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> diff -r be24166159b0 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Wed Sep 01 12:53:24 2010 +0100 +++ b/tools/libxl/libxl.c Wed Sep 01 13:04:16 2010 +0100 @@ -2720,58 +2720,68 @@ int libxl_device_vfb_hard_shutdown(libxl /******************************************************************************/ -int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb, int enforce) +int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t + target_memkb, int enforce) { libxl_gc gc = LIBXL_INIT_GC(ctx); - int rc = 1; - uint32_t memorykb = 0, videoram = 0; - char *memmax, *endptr, *videoram_s = NULL; + int rc = 1, abort = 0; + uint32_t videoram = 0; + char *videoram_s = NULL; char *dompath = libxl_xs_get_dompath(&gc, domid); xc_domaininfo_t info; libxl_dominfo ptr; char *uuid; - - if (domid) { - memmax = libxl_xs_read(&gc, XBT_NULL, libxl_sprintf(&gc, "%s/memory/static-max", dompath)); - if (!memmax) { + xs_transaction_t t; + +retry_transaction: + t = xs_transaction_start(ctx->xsh); + + videoram_s = libxl_xs_read(&gc, t, libxl_sprintf(&gc, "%s/memory/videoram", + dompath)); + videoram = videoram_s ? atoi(videoram_s) : 0; + + if (enforce) { + rc = xc_domain_setmaxmem(ctx->xch, domid, target_memkb + + LIBXL_MAXMEM_CONSTANT); + if (rc != 0) { XL_LOG_ERRNO(ctx, XL_LOG_ERROR, - "cannot get memory info from %s/memory/static-max\n", dompath); + "xc_domain_setmaxmem domid=%d memkb=%d failed " + "rc=%d\n", domid, target_memkb + LIBXL_MAXMEM_CONSTANT, rc); + abort = 1; goto out; } - memorykb = strtoul(memmax, &endptr, 10); - if (*endptr != '\0') { - XL_LOG_ERRNO(ctx, XL_LOG_ERROR, - "invalid max memory %s from %s/memory/static-max\n", memmax, dompath); - goto out; - } - - if (target_memkb > memorykb) { - XL_LOG(ctx, XL_LOG_ERROR, - "memory_dynamic_max must be less than or equal to memory_static_max\n"); - goto out; - } + libxl_xs_write(&gc, t, libxl_sprintf(&gc, "%s/memory/static-max", + dompath), "%"PRIu32, target_memkb); } - videoram_s = libxl_xs_read(&gc, XBT_NULL, libxl_sprintf(&gc, "%s/memory/videoram", dompath)); - videoram = videoram_s ? atoi(videoram_s) : 0; - - libxl_xs_write(&gc, XBT_NULL, libxl_sprintf(&gc, "%s/memory/target", dompath), "%"PRIu32, target_memkb); - + rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - + videoram) / 4, NULL, NULL, NULL); + if (rc != 0) { + XL_LOG_ERRNO(ctx, XL_LOG_ERROR, + "xc_domain_memory_set_pod_target domid=%d, memkb=%d " + "failed rc=%d\n", domid, (target_memkb - videoram) / 4, + rc); + abort = 1; + goto out; + } + + libxl_xs_write(&gc, t, libxl_sprintf(&gc, "%s/memory/target", dompath), + "%"PRIu32, target_memkb); rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info); - if (rc != 1 || info.domain != domid) + if (rc != 1 || info.domain != domid) { + abort = 1; goto out; + } xcinfo2xlinfo(&info, &ptr); uuid = libxl_uuid2string(&gc, ptr.uuid); - libxl_xs_write(&gc, XBT_NULL, libxl_sprintf(&gc, "/vm/%s/memory", uuid), "%"PRIu32, target_memkb / 1024); - - if (enforce || !domid) - memorykb = target_memkb; - rc = xc_domain_setmaxmem(ctx->xch, domid, memorykb + LIBXL_MAXMEM_CONSTANT); - if (rc != 0) - goto out; - rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - videoram) / 4, NULL, NULL, NULL); + libxl_xs_write(&gc, t, libxl_sprintf(&gc, "/vm/%s/memory", uuid), "%"PRIu32, + target_memkb / 1024); out: + if (!xs_transaction_end(ctx->xsh, t, abort) && !abort) + if (errno == EAGAIN) + goto retry_transaction; + libxl_free_all(&gc); return rc; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |