From: Andres Lagar-Cavilla <andres@lagarcavilla.com>
To: xen-devel@lists.xensource.com,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
Vincent Hanquez <vincent.hanquez@eu.citrix.com>
Subject: Re: [PATCH] libxenlight: implement libxl_set_memory_target
Date: Tue, 08 Dec 2009 15:29:55 -0500 [thread overview]
Message-ID: <4B1EB743.3090102@lagarcavilla.com> (raw)
In-Reply-To: <20091208200031.4903B5980EB@homiemail-mx11.g.dreamhost.com>
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 <stefano.stabellini@eu.citrix.com>
>
> ---
>
> 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 <ConfigFile> [options] [vars]\n\n");
> printf("Create a domain based on <ConfigFile>.\n\n");
> @@ -804,7 +808,52 @@
> } else if (!strcmp(command, "cd-eject")) {
> printf("Usage: xl cd-eject <Domain> <VirtualDevice>\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 <Domain> <MemKB>\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]);
>
>
>
>
next parent reply other threads:[~2009-12-08 20:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20091208200031.4903B5980EB@homiemail-mx11.g.dreamhost.com>
2009-12-08 20:29 ` Andres Lagar-Cavilla [this message]
2009-12-09 13:19 ` [PATCH] libxenlight: implement libxl_set_memory_target Stefano Stabellini
2009-12-09 20:47 ` Andres Lagar-Cavilla
2009-12-10 13:37 ` Stefano Stabellini
2009-12-10 14:01 ` Andres Lagar-Cavilla
2009-12-10 14:41 ` Stefano Stabellini
2009-12-10 15:10 ` Andres Lagar-Cavilla
2009-12-08 18:23 Stefano Stabellini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B1EB743.3090102@lagarcavilla.com \
--to=andres@lagarcavilla.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=vincent.hanquez@eu.citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.