[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v2 03/17] libxl: Handle Linux stubdomain specific QEMU options.
From: Eric Shelton <eshelton@xxxxxxxxx> This patch creates an appropriate command line for the QEMU instance running in a Linux-based stubdomain. NOTE: a number of items are not currently implemented for Linux-based stubdomains, such as: - save/restore - QMP socket - graphics output (e.g., VNC) Signed-off-by: Eric Shelton <eshelton@xxxxxxxxx> Simon: * fix disk path * fix cdrom path and "format" * pass downscript for network interfaces Signed-off-by: Simon Gaiser <simon@xxxxxxxxxxxxxxxxxxxxxx> [drop Qubes-specific parts] Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> --- Changes in v2: - fix serial specified with serial=[ ... ] syntax - error out on multiple consoles (incompatible with stubdom) - drop erroneous chunk about cdrom --- tools/libxl/libxl_dm.c | 114 +++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 33 deletions(-) diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index ebe8e0c..82ff490 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -25,9 +25,24 @@ #include <pwd.h> #include <grp.h> -static const char *libxl_tapif_script(libxl__gc *gc) +static const char *libxl_tapif_script(libxl__gc *gc, + const libxl_domain_build_info *info) { #if defined(__linux__) || defined(__FreeBSD__) + if (info->stubdomain_version == LIBXL_STUBDOMAIN_VERSION_LINUX) + return libxl__sprintf(gc, "/etc/qemu-ifup"); + return libxl__strdup(gc, "no"); +#else + return GCSPRINTF("%s/qemu-ifup", libxl__xen_script_dir_path()); +#endif +} + +static const char *libxl_tapif_downscript(libxl__gc *gc, + const libxl_domain_build_info *info) +{ +#if defined(__linux__) || defined(__FreeBSD__) + if (info->stubdomain_version == LIBXL_STUBDOMAIN_VERSION_LINUX) + return libxl__sprintf(gc, "/etc/qemu-ifdown"); return libxl__strdup(gc, "no"); #else return GCSPRINTF("%s/qemu-ifup", libxl__xen_script_dir_path()); @@ -616,8 +631,8 @@ static int libxl__build_device_model_args_old(libxl__gc *gc, "tap,vlan=%d,ifname=%s,bridge=%s," "script=%s,downscript=%s", nics[i].devid, ifname, nics[i].bridge, - libxl_tapif_script(gc), - libxl_tapif_script(gc)), + libxl_tapif_script(gc, b_info), + libxl_tapif_downscript(gc, b_info)), NULL); ioemu_nics++; } @@ -933,6 +948,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, const char *path, *chardev; char *user = NULL; struct passwd *user_base, user_pwbuf; + bool is_stubdom = libxl_defbool_val(b_info->device_model_stubdomain); dm_args = flexarray_make(gc, 16, 1); dm_envs = flexarray_make(gc, 16, 1); @@ -943,24 +959,27 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, "-xen-domid", GCSPRINTF("%d", guest_domid), NULL); - flexarray_append(dm_args, "-chardev"); - flexarray_append(dm_args, - GCSPRINTF("socket,id=libxl-cmd," - "path=%s/qmp-libxl-%d,server,nowait", - libxl__run_dir_path(), guest_domid)); + /* There is currently no way to access the QMP socket in the stubdom */ + if (!is_stubdom) { + flexarray_append(dm_args, "-chardev"); + flexarray_append(dm_args, + GCSPRINTF("socket,id=libxl-cmd," + "path=%s/qmp-libxl-%d,server,nowait", + libxl__run_dir_path(), guest_domid)); - flexarray_append(dm_args, "-no-shutdown"); - flexarray_append(dm_args, "-mon"); - flexarray_append(dm_args, "chardev=libxl-cmd,mode=control"); + flexarray_append(dm_args, "-no-shutdown"); + flexarray_append(dm_args, "-mon"); + flexarray_append(dm_args, "chardev=libxl-cmd,mode=control"); - flexarray_append(dm_args, "-chardev"); - flexarray_append(dm_args, - GCSPRINTF("socket,id=libxenstat-cmd," - "path=%s/qmp-libxenstat-%d,server,nowait", - libxl__run_dir_path(), guest_domid)); + flexarray_append(dm_args, "-chardev"); + flexarray_append(dm_args, + GCSPRINTF("socket,id=libxenstat-cmd," + "path=%s/qmp-libxenstat-%d,server,nowait", + libxl__run_dir_path(), guest_domid)); - flexarray_append(dm_args, "-mon"); - flexarray_append(dm_args, "chardev=libxenstat-cmd,mode=control"); + flexarray_append(dm_args, "-mon"); + flexarray_append(dm_args, "chardev=libxenstat-cmd,mode=control"); + } for (i = 0; i < guest_config->num_channels; i++) { connection = guest_config->channels[i].connection; @@ -1004,7 +1023,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, flexarray_vappend(dm_args, "-name", c_info->name, NULL); } - if (vnc) { + if (vnc && !is_stubdom) { char *vncarg = NULL; flexarray_append(dm_args, "-vnc"); @@ -1043,7 +1062,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, } flexarray_append(dm_args, vncarg); - } else + } else if (!is_stubdom) /* * Ensure that by default no vnc server is created. */ @@ -1055,7 +1074,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, */ flexarray_append_pair(dm_args, "-display", "none"); - if (sdl) { + if (sdl && !is_stubdom) { flexarray_append(dm_args, "-sdl"); if (sdl->display) flexarray_append_pair(dm_envs, "DISPLAY", sdl->display); @@ -1099,10 +1118,31 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, return ERROR_INVAL; } if (b_info->u.hvm.serial) { - flexarray_vappend(dm_args, - "-serial", b_info->u.hvm.serial, NULL); - } else if (b_info->u.hvm.serial_list) { + if (is_stubdom) { + flexarray_vappend(dm_args, + "-serial", + GCSPRINTF("/dev/hvc%d", + STUBDOM_CONSOLE_SERIAL), + NULL); + } else { + flexarray_vappend(dm_args, + "-serial", b_info->u.hvm.serial, NULL); + } + } else if (b_info->u.hvm.serial_list && + b_info->u.hvm.serial_list[0]) { char **p; + if (is_stubdom) { + if (b_info->u.hvm.serial_list[1]) { + LOGD(ERROR, guest_domid, + "device model in stubdomain doesn't support multiple serial consoles"); + return ERROR_INVAL; + } + flexarray_vappend(dm_args, + "-serial", + GCSPRINTF("/dev/hvc%d", + STUBDOM_CONSOLE_SERIAL), + NULL); + } for (p = b_info->u.hvm.serial_list; *p; p++) { @@ -1117,7 +1157,7 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, flexarray_append(dm_args, "-nographic"); } - if (libxl_defbool_val(b_info->u.hvm.spice.enable)) { + if (libxl_defbool_val(b_info->u.hvm.spice.enable) && !is_stubdom) { const libxl_spice_info *spice = &b_info->u.hvm.spice; char *spiceoptions = dm_spice_options(gc, spice); if (!spiceoptions) @@ -1256,8 +1296,8 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, GCSPRINTF("type=tap,id=net%d,ifname=%s," "script=%s,downscript=%s", nics[i].devid, ifname, - libxl_tapif_script(gc), - libxl_tapif_script(gc))); + libxl_tapif_script(gc, b_info), + libxl_tapif_downscript(gc, b_info))); /* Userspace COLO Proxy need this */ #define APPEND_COLO_SOCK_SERVER(sock_id, sock_ip, sock_port) ({ \ @@ -1503,7 +1543,9 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, * If qemu isn't doing the interpreting, the parameter is * always raw */ - if (disks[i].backend == LIBXL_DISK_BACKEND_QDISK) + if (libxl_defbool_val(b_info->device_model_stubdomain)) + format = "host_device"; + else if (disks[i].backend == LIBXL_DISK_BACKEND_QDISK) format = libxl__qemu_disk_format_string(disks[i].format); else format = libxl__qemu_disk_format_string(LIBXL_DISK_FORMAT_RAW); @@ -1514,6 +1556,8 @@ static int libxl__build_device_model_args_new(libxl__gc *gc, disks[i].vdev); continue; } + } else if (libxl_defbool_val(b_info->device_model_stubdomain)) { + target_path = GCSPRINTF("/dev/xvd%c", 'a' + disk); } else { if (format == NULL) { LOGD(WARN, guest_domid, @@ -1727,7 +1771,7 @@ static int libxl__build_device_model_args(libxl__gc *gc, char ***args, char ***envs, const libxl__domain_build_state *state, int *dm_state_fd) -/* dm_state_fd may be NULL iff caller knows we are using old stubdom +/* dm_state_fd may be NULL iff caller knows we are using stubdom * and therefore will be passing a filename rather than a fd. */ { switch (guest_config->b_info.device_model_version) { @@ -1737,8 +1781,10 @@ static int libxl__build_device_model_args(libxl__gc *gc, args, envs, state); case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: - assert(dm_state_fd != NULL); - assert(*dm_state_fd < 0); + if (!libxl_defbool_val(guest_config->b_info.device_model_stubdomain)) { + assert(dm_state_fd != NULL); + assert(*dm_state_fd < 0); + } return libxl__build_device_model_args_new(gc, dm, guest_domid, guest_config, args, envs, @@ -1796,7 +1842,7 @@ static int libxl__vfb_and_vkb_from_hvm_guest_config(libxl__gc *gc, static int libxl__write_stub_dmargs(libxl__gc *gc, int dm_domid, int guest_domid, - char **args) + char **args, bool linux_stubdom) { libxl_ctx *ctx = libxl__gc_owner(gc); int i; @@ -1824,7 +1870,9 @@ static int libxl__write_stub_dmargs(libxl__gc *gc, i = 1; dmargs[0] = '\0'; while (args[i] != NULL) { - if (strcmp(args[i], "-sdl") && strcmp(args[i], "-M") && strcmp(args[i], "xenfv")) { + if (linux_stubdom || + (strcmp(args[i], "-sdl") && + strcmp(args[i], "-M") && strcmp(args[i], "xenfv"))) { strcat(dmargs, " "); strcat(dmargs, args[i]); } -- git-series 0.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |