This patch was dropped. Resending.
This version contains minor bug fix. Please don't use previous version.
-----------------------------------------------------------
commit a0f5de6a0cf3e033efbc2297817bcddcdce6f0fd
Author: Wei Liu <liuw@xxxxxxxxx>
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@xxxxxxxxx>
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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|