From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andres Lagar-Cavilla Subject: Re: [PATCH] libxenlight: implement libxl_set_memory_target Date: Tue, 08 Dec 2009 15:29:55 -0500 Message-ID: <4B1EB743.3090102@lagarcavilla.com> References: <20091208200031.4903B5980EB@homiemail-mx11.g.dreamhost.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20091208200031.4903B5980EB@homiemail-mx11.g.dreamhost.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com, Stefano Stabellini , Vincent Hanquez List-Id: xen-devel@lists.xenproject.org Hi, couple of comments: - PV domains without videoram won't be able to use this - Further, doesn't the PV domain build function need to use target_memkb? (That's my read of what xend does at least) - Finally, LIBXL_MAXMEM_CONSTANT looks like an "evil constant we should avoid". Where did it come from? Andres > Hi all, > this patch adds a target_memkb parameter to libxl_domain_build_info to > set the target memory for the VM at build time and a new function > called libxl_set_memory_target to dynamically modify the memory target > of a VM at run time. > Finally a new command "mem-set" is added to xl that calls directly > libxl_set_memory_target. > > Signed-off-by: Stefano Stabellini > > --- > > diff -r fe3c8ba27d2f tools/libxl/libxl.c > --- a/tools/libxl/libxl.c Tue Dec 08 17:02:15 2009 +0000 > +++ b/tools/libxl/libxl.c Tue Dec 08 17:14:35 2009 +0000 > @@ -935,6 +935,7 @@ > memset(&b_info, 0x00, sizeof(libxl_domain_build_info)); > b_info.max_vcpus = 1; > b_info.max_memkb = 32 * 1024; > + b_info.target_memkb = b_info.max_memkb; > b_info.kernel = "/usr/lib/xen/boot/ioemu-stubdom.gz"; > b_info.u.pv.cmdline = libxl_sprintf(ctx, " -d %d", info->domid); > b_info.u.pv.ramdisk = ""; > @@ -2264,6 +2265,7 @@ > b_info->vpt_align = -1; > b_info->max_vcpus = 1; > b_info->max_memkb = 32 * 1024; > + b_info->target_memkb = b_info->max_memkb; > if (c_info->hvm) { > b_info->shadow_memkb = libxl_get_required_shadow_memory(b_info->max_memkb, b_info->max_vcpus); > b_info->video_memkb = 8 * 1024; > @@ -2356,4 +2358,22 @@ > console->build_state = state; > } > > +int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb) > +{ > + int rc = 0; > + uint32_t videoram; > + char *videoram_s = NULL; > + char *dompath = libxl_xs_get_dompath(ctx, domid); > > + videoram_s = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/memory/videoram", dompath)); > + if (!videoram_s) > + return -1; > + videoram = atoi(videoram_s); > + > + libxl_xs_write(ctx, XBT_NULL, libxl_sprintf(ctx, "%s/memory/target", dompath), "%lu", target_memkb); > + if ((rc = xc_domain_setmaxmem(ctx->xch, domid, target_memkb + LIBXL_MAXMEM_CONSTANT)) != 0) return rc; > + rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - videoram) / 4, NULL, NULL, NULL); > + return rc; > +} > + > + > diff -r fe3c8ba27d2f tools/libxl/libxl.h > --- a/tools/libxl/libxl.h Tue Dec 08 17:02:15 2009 +0000 > +++ b/tools/libxl/libxl.h Tue Dec 08 17:14:35 2009 +0000 > @@ -66,6 +66,7 @@ > int max_vcpus; > int cur_vcpus; > uint32_t max_memkb; > + uint32_t target_memkb; > uint32_t video_memkb; > uint32_t shadow_memkb; > const char *kernel; > @@ -305,6 +306,8 @@ > int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid); > int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid); > > +int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb); > + > int libxl_console_attach(struct libxl_ctx *ctx, uint32_t domid, int cons_num); > > struct libxl_dominfo * libxl_domain_list(struct libxl_ctx *ctx, int *nb_domain); > diff -r fe3c8ba27d2f tools/libxl/libxl_dom.c > --- a/tools/libxl/libxl_dom.c Tue Dec 08 17:02:15 2009 +0000 > +++ b/tools/libxl/libxl_dom.c Tue Dec 08 17:14:35 2009 +0000 > @@ -52,7 +52,7 @@ > if (info->vpt_align != -1) > xc_set_hvm_param(ctx->xch, domid, HVM_PARAM_VPT_ALIGN, (unsigned long) info->vpt_align); > xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus); > - xc_domain_setmaxmem(ctx->xch, domid, info->max_memkb + info->video_memkb); > + xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT); > xc_domain_set_memmap_limit(ctx->xch, domid, > (info->hvm) ? info->max_memkb : > (info->max_memkb + info->u.pv.slack_memkb)); > @@ -81,7 +81,9 @@ > ents[0] = "memory/static-max"; > ents[1] = libxl_sprintf(ctx, "%d", info->max_memkb); > ents[2] = "memory/target"; > - ents[3] = libxl_sprintf(ctx, "%d", info->max_memkb); /* PROBABLY WRONG */ > + ents[3] = libxl_sprintf(ctx, "%d", info->target_memkb); > + ents[2] = "memory/videoram"; > + ents[3] = libxl_sprintf(ctx, "%d", info->video_memkb); > ents[4] = "domid"; > ents[5] = libxl_sprintf(ctx, "%d", domid); > ents[6] = "store/port"; > @@ -145,7 +147,7 @@ > { > int ret; > > - ret = xc_hvm_build(ctx->xch, domid, info->max_memkb / 1024, info->kernel); > + ret = xc_hvm_build_target_mem(ctx->xch, domid, (info->max_memkb - info->video_memkb) / 1024, (info->target_memkb - info->video_memkb) / 1024, info->kernel); > if (ret) { > XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, ret, "hvm building failed"); > return ERROR_FAIL; > diff -r fe3c8ba27d2f tools/libxl/libxl_internal.h > --- a/tools/libxl/libxl_internal.h Tue Dec 08 17:02:15 2009 +0000 > +++ b/tools/libxl/libxl_internal.h Tue Dec 08 17:14:35 2009 +0000 > @@ -31,6 +31,7 @@ > #define LIBXL_DEVICE_MODEL_START_TIMEOUT 10 > #define LIBXL_XENCONSOLE_LIMIT 1048576 > #define LIBXL_XENCONSOLE_PROTOCOL "vt100" > +#define LIBXL_MAXMEM_CONSTANT (1 * 1024 * 1024) > #define QEMU_SIGNATURE "QemuDeviceModelRecord" > > #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) > diff -r fe3c8ba27d2f tools/libxl/xl.c > --- a/tools/libxl/xl.c Tue Dec 08 17:02:15 2009 +0000 > +++ b/tools/libxl/xl.c Tue Dec 08 17:14:35 2009 +0000 > @@ -85,6 +85,7 @@ > printf("vpt_align: %d\n", b_info->vpt_align); > printf("max_vcpus: %d\n", b_info->max_vcpus); > printf("max_memkb: %d\n", b_info->max_memkb); > + printf("target_memkb: %d\n", b_info->target_memkb); > printf("kernel: %s\n", b_info->kernel); > printf("hvm: %d\n", b_info->hvm); > > @@ -283,8 +284,10 @@ > if (config_lookup_int (&config, "vcpus", &l) == CONFIG_TRUE) > b_info->max_vcpus = l; > > - if (config_lookup_int (&config, "memory", &l) == CONFIG_TRUE) > + if (config_lookup_int (&config, "memory", &l) == CONFIG_TRUE) { > b_info->max_memkb = l * 1024; > + b_info->target_memkb = b_info->max_memkb; > + } > > if (config_lookup_int (&config, "shadow_memory", &l) == CONFIG_TRUE) > b_info->shadow_memkb = l * 1024; > @@ -756,6 +759,7 @@ > printf(" restore restore a domain from a saved state\n\n"); > printf(" cd-insert insert a cdrom into a guest's cd drive\n\n"); > printf(" cd-eject eject a cdrom from a guest's cd drive\n\n"); > + printf(" mem-set set the current memory usage for a domain\n\n"); > } else if(!strcmp(command, "create")) { > printf("Usage: xl create [options] [vars]\n\n"); > printf("Create a domain based on .\n\n"); > @@ -804,7 +808,52 @@ > } else if (!strcmp(command, "cd-eject")) { > printf("Usage: xl cd-eject \n\n"); > printf("Eject a cdrom from a guest's cd drive.\n\n"); > + } else if (!strcmp(command, "mem-set")) { > + printf("Usage: xl mem-set \n\n"); > + printf("Set the current memory usage for a domain.\n\n"); > } > +} > + > +void set_memory_target(char *p, char *mem) > +{ > + struct libxl_ctx ctx; > + uint32_t domid; > + > + libxl_ctx_init(&ctx); > + libxl_ctx_set_log(&ctx, log_callback, NULL); > + > + if (libxl_param_to_domid(&ctx, p, &domid) < 0) { > + fprintf(stderr, "%s is an invalid domain identifier\n", p); > + exit(2); > + } > + libxl_set_memory_target(&ctx, domid, atoi(mem)); > +} > + > +int main_memset(int argc, char **argv) > +{ > + int opt = 0; > + char *p = NULL, *mem; > + > + while ((opt = getopt(argc, argv, "h:")) != -1) { > + switch (opt) { > + case 'h': > + help("mem-set"); > + exit(0); > + default: > + fprintf(stderr, "option not supported\n"); > + break; > + } > + } > + if (optind >= argc - 1) { > + help("mem-set"); > + exit(2); > + } > + > + p = argv[optind]; > + mem = argv[optind + 1]; > + > + set_memory_target(p, mem); > + exit(0); > } > > void console(char *p, int cons_num) > @@ -1436,6 +1485,8 @@ > main_cd_insert(argc - 1, argv + 1); > } else if (!strcmp(argv[1], "cd-eject")) { > main_cd_eject(argc - 1, argv + 1); > + } else if (!strcmp(argv[1], "mem-set")) { > + main_memset(argc - 1, argv + 1); > } else if (!strcmp(argv[1], "help")) { > if (argc > 2) > help(argv[2]); > > > >