commit 02cf9f9cfdf720c636c6ba08f795e49b5eb1f03e
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.
Signed-off-by: Wei Liu <liuw@xxxxxxxxx>
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 62294b2..4ff3c7d 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -507,7 +507,8 @@ static int do_domain_create(libxl__gc *gc,
libxl_domain_config *d_config,
libxl_device_console_destroy(&console);
if (need_qemu)
- libxl__create_xenpv_qemu(gc, domid, d_config->vfbs, &dm_starting);
+ libxl__create_xenpv_qemu(gc, domid, &d_config->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 47a51c8..0505c84 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -702,7 +702,7 @@ retry_transaction:
if (ret)
goto out_free;
}
- if (libxl__create_xenpv_qemu(gc, domid, vfb, &dm_starting) < 0) {
+ if (libxl__create_xenpv_qemu(gc, domid, info, vfb, &dm_starting) < 0) {
ret = ERROR_FAIL;
goto out_free;
}
@@ -909,8 +909,8 @@ 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));
+ info->vnc = 0;
if (vfb != NULL) {
info->vnc = vfb->vnc;
if (vfb->vnclisten)
@@ -927,9 +927,12 @@ 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;
+ info->target_ram = 0;
+ info->videoram = 0;
+ info->acpi = 0;
+ info->vcpus = 0;
+ info->vcpu_avail = 0;
+ info->xen_platform_pci = 0;
return 0;
}
@@ -985,12 +988,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 *dm_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, dm_info);
+ libxl__create_device_model(gc, dm_info, NULL, 0, NULL, 0, starting_r);
return 0;
}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 64e1d56..55e9f7f 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -256,7 +256,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 5415bc5..74a77a7 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -626,6 +626,8 @@ static void parse_config_data(const char
*configfile_filename_report,
int pci_power_mgmt = 0;
int pci_msitranslate = 1;
int e;
+ XLU_ConfigList *dmargs;
+ int nr_dmargs = 0;
libxl_domain_create_info *c_info = &d_config->c_info;
libxl_domain_build_info *b_info = &d_config->b_info;
@@ -1075,14 +1077,10 @@ 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);
- /* then process config related to dm */
+ if (c_info->hvm == 1) {
if (!xlu_cfg_get_string (config, "device_model", &buf)) {
fprintf(stderr,
"WARNING: ignoring device_model directive.\n"
@@ -1147,6 +1145,42 @@ skip_vfb:
dm_info->extra[i] = a ? strdup(a) : NULL;
}
}
+ } else {
+ 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");
+ }
+
+ 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))
+ fprintf(stderr, "WARNING: ignoring
device_model_stubdomain_override for PV guest\n");
+
+ 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
|