Wei Liu
2011-Jul-16 06:06 UTC
[Xen-devel] [PATCH] libxl: enabling upstream qemu as pure pv backend.
This patch was dropped. Resending. This version contains minor bug fix. Please don''t use previous version. ----------------------------------------------------------- commit a0f5de6a0cf3e033efbc2297817bcddcdce6f0fd Author: Wei Liu <liuw@liuw.name> Date: Wed Jun 8 11:13:25 2011 +0800 libxl: enabling upstream qemu as pure pv backend. This patch makes device_model_{version,override} work for pure pv guest, so that users can specify upstream qemu as pure pv backend other than traditional qemu-xen. This patch also adds device_model_args_{pv,fv} options for pv and fv guest respectively. Internally, original libxl__create_xenpv_qemu allocates a new empty dm_info (struct libxl_device_model_info) for every xenpv qemu created. Now the caller of libxl__create_xenpv_qemu is responsible for allocating this dm_info. Signed-off-by: Wei Liu <liuw@liuw.name> diff --git a/tools/libxl/libxl.idl b/tools/libxl/libxl.idl index f7249b1..183d2cd 100644 --- a/tools/libxl/libxl.idl +++ b/tools/libxl/libxl.idl @@ -240,6 +240,8 @@ The password never expires"""), ("vcpu_avail", integer, False, "vcpus actually available"), ("xen_platform_pci", bool, False, "enable/disable the xen platform pci device"), ("extra", libxl_string_list, False, "extra parameters pass directly to qemu, NULL terminated"), + ("extra_pv", libxl_string_list, False, "extra parameters pass directly to qemu for PV guest, NULL terminated"), + ("extra_fv", libxl_string_list, False, "extra parameters pass directly to qemu for FV guest, NULL terminated"), ], comment """Device Model information. diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index b74b66f..0dc0d11 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -495,6 +495,7 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config, } else { int need_qemu = 0; libxl_device_console console; + libxl_device_model_info xenpv_dm_info; for (i = 0; i < d_config->num_vfbs; i++) { libxl_device_vfb_add(ctx, domid, &d_config->vfbs[i]); @@ -515,8 +516,18 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config, libxl__device_console_add(gc, domid, &console, &state); libxl_device_console_destroy(&console); + /* only copy those useful configs */ + memset((void*)&xenpv_dm_info, 0x00, sizeof(libxl_device_model_info)); + xenpv_dm_info.device_model_version + d_config->dm_info.device_model_version; + xenpv_dm_info.type = d_config->dm_info.type; + xenpv_dm_info.device_model = d_config->dm_info.device_model; + xenpv_dm_info.extra = d_config->dm_info.extra; + xenpv_dm_info.extra_pv = d_config->dm_info.extra_pv; + xenpv_dm_info.extra_fv = d_config->dm_info.extra_fv; if (need_qemu) - libxl__create_xenpv_qemu(gc, domid, d_config->vfbs, &dm_starting); + libxl__create_xenpv_qemu(gc, domid, &xenpv_dm_info, + d_config->vfbs, &dm_starting); } if (dm_starting) { diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index b9bf4b0..e8a7664 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -206,9 +206,13 @@ static char ** libxl__build_device_model_args_old(libxl__gc *gc, switch (info->type) { case LIBXL_DOMAIN_TYPE_PV: flexarray_append(dm_args, "xenpv"); + for (i = 0; info->extra_pv && info->extra_pv[i] != NULL; i++) + flexarray_append(dm_args, info->extra_pv[i]); break; case LIBXL_DOMAIN_TYPE_FV: flexarray_append(dm_args, "xenfv"); + for (i = 0; info->extra_fv && info->extra_fv[i] != NULL; i++) + flexarray_append(dm_args, info->extra_fv[i]); break; } flexarray_append(dm_args, NULL); @@ -403,9 +407,13 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc, switch (info->type) { case LIBXL_DOMAIN_TYPE_PV: flexarray_append(dm_args, "xenpv"); + for (i = 0; info->extra_pv && info->extra_pv[i] != NULL; i++) + flexarray_append(dm_args, info->extra_pv[i]); break; case LIBXL_DOMAIN_TYPE_FV: flexarray_append(dm_args, "xenfv"); + for (i = 0; info->extra_fv && info->extra_fv[i] != NULL; i++) + flexarray_append(dm_args, info->extra_fv[i]); break; } @@ -614,6 +622,7 @@ static int libxl__create_stubdom(libxl__gc *gc, struct xs_permissions perm[2]; xs_transaction_t t; libxl__device_model_starting *dm_starting = 0; + libxl_device_model_info xenpv_dm_info; if (info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL) { ret = ERROR_INVAL; @@ -647,6 +656,7 @@ static int libxl__create_stubdom(libxl__gc *gc, /* fixme: this function can leak the stubdom if it fails */ + domid = 0; ret = libxl__domain_make(gc, &c_info, &domid); if (ret) goto out_free; @@ -741,7 +751,14 @@ retry_transaction: if (ret) goto out_free; } - if (libxl__create_xenpv_qemu(gc, domid, vfb, &dm_starting) < 0) { + + memset((void*)&xenpv_dm_info, 0x00, sizeof(libxl_device_model_info)); + xenpv_dm_info.device_model_version = info->device_model_version; + xenpv_dm_info.type = LIBXL_DOMAIN_TYPE_PV; + xenpv_dm_info.device_model = info->device_model; + if (libxl__create_xenpv_qemu(gc, domid, + &xenpv_dm_info, + vfb, &dm_starting) < 0) { ret = ERROR_FAIL; goto out_free; } @@ -950,7 +967,6 @@ static int libxl__build_xenpv_qemu_args(libxl__gc *gc, libxl_device_model_info *info) { libxl_ctx *ctx = libxl__gc_owner(gc); - memset(info, 0x00, sizeof(libxl_device_model_info)); if (vfb != NULL) { info->vnc = vfb->vnc; @@ -968,9 +984,6 @@ static int libxl__build_xenpv_qemu_args(libxl__gc *gc, info->nographic = 1; info->domid = domid; info->dom_name = libxl_domid_to_name(ctx, domid); - info->device_model_version = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; - info->device_model = NULL; - info->type = LIBXL_DOMAIN_TYPE_PV; return 0; } @@ -1011,12 +1024,12 @@ out: return ret; } -int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid, libxl_device_vfb *vfb, +int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid, + libxl_device_model_info *info, + libxl_device_vfb *vfb, libxl__device_model_starting **starting_r) { - libxl_device_model_info info; - - libxl__build_xenpv_qemu_args(gc, domid, vfb, &info); - libxl__create_device_model(gc, &info, NULL, 0, NULL, 0, starting_r); + libxl__build_xenpv_qemu_args(gc, domid, vfb, info); + libxl__create_device_model(gc, info, NULL, 0, NULL, 0, starting_r); return 0; } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 579188e..3175368 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -264,7 +264,9 @@ _hidden int libxl__create_device_model(libxl__gc *gc, libxl_device_disk *disk, int num_disks, libxl_device_nic *vifs, int num_vifs, libxl__device_model_starting **starting_r); -_hidden int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid, libxl_device_vfb *vfb, +_hidden int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid, + libxl_device_model_info *dm_info, + libxl_device_vfb *vfb, libxl__device_model_starting **starting_r); _hidden int libxl__need_xenpv_qemu(libxl__gc *gc, int nr_consoles, libxl_device_console *consoles, diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index dafd741..be58871 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -523,6 +523,13 @@ static void parse_config_data(const char *configfile_filename_report, int pci_msitranslate = 1; int e; + XLU_ConfigList *dmargs; + int nr_dmargs = 0; + XLU_ConfigList *dmargs_fv; + int nr_dmargs_fv = 0; + XLU_ConfigList *dmargs_pv; + int nr_dmargs_pv = 0; + libxl_domain_create_info *c_info = &d_config->c_info; libxl_domain_build_info *b_info = &d_config->b_info; @@ -994,40 +1001,74 @@ skip_vfb: break; } - if (c_info->hvm == 1) { - XLU_ConfigList *dmargs; - int nr_dmargs = 0; - - /* init dm from c and b */ - libxl_init_dm_info(dm_info, c_info, b_info); + /* init dm from c and b */ + libxl_init_dm_info(dm_info, c_info, b_info); + /* parse device model arguments, this works for pv, fv and stubdom */ + if (!xlu_cfg_get_string (config, "device_model", &buf)) { + fprintf(stderr, + "WARNING: ignoring device_model directive.\n" + "WARNING: Use \"device_model_override\" instead if you" + " really want a non-default device_model\n"); + if (strstr(buf, "stubdom-dm")) { + if (c_info->hvm == 1) + fprintf(stderr, "WARNING: Or use" + " \"device_model_stubdomain_override\" if you " + " want to enable stubdomains\n"); + else + fprintf(stderr, "WARNING: ignoring" + " \"device_model_stubdomain_override\" directive" + " for pv guest\n"); + } + } - /* then process config related to dm */ - if (!xlu_cfg_get_string (config, "device_model", &buf)) { + xlu_cfg_replace_string (config, "device_model_override", + &dm_info->device_model); + if (!xlu_cfg_get_string (config, "device_model_version", &buf)) { + if (!strcmp(buf, "qemu-xen-traditional")) { + dm_info->device_model_version + = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; + } else if (!strcmp(buf, "qemu-xen")) { + dm_info->device_model_version + = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; + } else { fprintf(stderr, - "WARNING: ignoring device_model directive.\n" - "WARNING: Use \"device_model_override\" instead if you really want a non-default device_model\n"); - if (strstr(buf, "stubdom-dm")) - fprintf(stderr, "WARNING: Or use \"device_model_stubdomain_override\" if you want to enable stubdomains\n"); + "Unknown device_model_version \"%s\" specified\n", buf); + exit(1); } + } else if (dm_info->device_model) + fprintf(stderr, "WARNING: device model override given " + " without specific DM version\n"); + + if (c_info->hvm == 1 && + !xlu_cfg_get_long (config, "device_model_stubdomain_override", &l)) + dm_info->device_model_stubdomain = l; + +#define parse_extra_args(type) \ + if (!xlu_cfg_get_list(config, "device_model_args"#type, \ + &dmargs##type, &nr_dmargs##type, 0)) \ + { \ + int i; \ + dm_info->extra##type = \ + xmalloc(sizeof(char*)*(nr_dmargs##type + 1)); \ + dm_info->extra##type[nr_dmargs##type] = NULL; \ + for (i=0; i<nr_dmargs##type; i++) { \ + const char *a = xlu_cfg_get_listitem(dmargs##type, i); \ + dm_info->extra##type[i] = a ? strdup(a) : NULL; \ + } \ + } \ - xlu_cfg_replace_string (config, "device_model_override", - &dm_info->device_model); - if (!xlu_cfg_get_string (config, "device_model_version", &buf)) { - if (!strcmp(buf, "qemu-xen-traditional")) { - dm_info->device_model_version - = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; - } else if (!strcmp(buf, "qemu-xen")) { - dm_info->device_model_version - = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; - } else { - fprintf(stderr, - "Unknown device_model_version \"%s\" specified\n", buf); - exit(1); - } - } else if (dm_info->device_model) - fprintf(stderr, "WARNING: device model override given without specific DM version\n"); - if (!xlu_cfg_get_long (config, "device_model_stubdomain_override", &l)) - dm_info->device_model_stubdomain = l; + /* parse extra args for qemu, common to both pv, fv */ + parse_extra_args(); + + /* parse extra args dedicated to pv */ + parse_extra_args(_pv); + + /* parse extra args dedicated to fv */ + parse_extra_args(_fv); + +#undef parse_extra_args + + if (c_info->hvm == 1) { if (!xlu_cfg_get_long (config, "stdvga", &l)) dm_info->stdvga = l; if (!xlu_cfg_get_long (config, "vnc", &l)) @@ -1069,17 +1110,6 @@ skip_vfb: xlu_cfg_replace_string (config, "soundhw", &dm_info->soundhw); if (!xlu_cfg_get_long (config, "xen_platform_pci", &l)) dm_info->xen_platform_pci = l; - - if (!xlu_cfg_get_list(config, "device_model_args", &dmargs, &nr_dmargs, 0)) - { - int i; - dm_info->extra = xmalloc(sizeof(char *) * (nr_dmargs + 1)); - dm_info->extra[nr_dmargs] = NULL; - for (i=0; i<nr_dmargs; i++) { - const char *a = xlu_cfg_get_listitem(dmargs, i); - dm_info->extra[i] = a ? strdup(a) : NULL; - } - } } dm_info->type = c_info->hvm ? _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel