|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 6/7] libxl: Build the domain with a Linux based stubdomain
On Tue, 3 Feb 2015, Eric Shelton wrote:
> This will build a Linux-based stubdomain with QEMU upstream.
>
> Signed-off-by: Eric Shelton <eshelton@xxxxxxxxx>
> ---
> tools/libxl/libxl.c | 25 ++++++++--
> tools/libxl/libxl_create.c | 7 ++-
> tools/libxl/libxl_dm.c | 108
> ++++++++++++++++++++++++++++++++++++-------
> tools/libxl/libxl_internal.c | 22 +++++++++
> tools/libxl/libxl_internal.h | 4 ++
> 5 files changed, 145 insertions(+), 21 deletions(-)
>
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 82227e8..85cf5eb 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -1757,8 +1757,17 @@ static int libxl__primary_console_find(libxl_ctx *ctx,
> uint32_t domid_vm,
>
> if (stubdomid) {
> *domid = stubdomid;
> - *cons_num = STUBDOM_CONSOLE_SERIAL;
> *type = LIBXL_CONSOLE_TYPE_PV;
> + switch (libxl__stubdomain_version_running(gc, stubdomid)) {
> + case LIBXL_STUBDOMAIN_VERSION_MINIOS:
> + *cons_num = STUBDOM_CONSOLE_SERIAL;
> + break;
> + case LIBXL_STUBDOMAIN_VERSION_LINUX:
> + *cons_num = 1;
You might want to introduce LINUX_STUBDOMAIN_CONSOLE_SERIAL and rename
the existing to MINIOS_STUBDOM_CONSOLE_SERIAL.
In any case I think you'll eventually want as many serial console in a
linux stubdom as you have in a minios stubdom.
> + break;
> + default:
> + abort();
> + }
> } else {
> switch (libxl__domain_type(gc, domid_vm)) {
> case LIBXL_DOMAIN_TYPE_HVM:
> @@ -4927,8 +4936,18 @@ int libxl_domain_need_memory(libxl_ctx *ctx,
> libxl_domain_build_info *b_info,
> switch (b_info->type) {
> case LIBXL_DOMAIN_TYPE_HVM:
> *need_memkb += b_info->shadow_memkb + LIBXL_HVM_EXTRA_MEMORY;
> - if (libxl_defbool_val(b_info->device_model_stubdomain))
> - *need_memkb += 32 * 1024;
> + if (libxl_defbool_val(b_info->device_model_stubdomain)) {
> + switch (b_info->stubdomain_version) {
> + case LIBXL_STUBDOMAIN_VERSION_MINIOS:
> + *need_memkb += 32 * 1024;
> + break;
> + case LIBXL_STUBDOMAIN_VERSION_LINUX:
> + *need_memkb += LIBXL_LINUX_STUBDOM_MEM * 1024;
> + break;
> + default:
> + abort();
> + }
> + }
> break;
> case LIBXL_DOMAIN_TYPE_PV:
> *need_memkb += b_info->shadow_memkb + LIBXL_PV_EXTRA_MEMORY;
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index 15258fa..b2c903e 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -1358,7 +1358,12 @@ static void domcreate_devmodel_started(libxl__egc *egc,
> if (dcs->dmss.dm.guest_domid) {
> if (d_config->b_info.device_model_version
> == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
> - libxl__qmp_initializations(gc, domid, d_config);
> + if
> (!libxl_defbool_val(d_config->b_info.device_model_stubdomain)) {
> + libxl__qmp_initializations(gc, domid, d_config);
> + } else {
> + int stubdom_domid = dcs->dmss.pvqemu.guest_domid;
> + libxl__qmp_initializations(gc, stubdom_domid, d_config);
> + }
> }
> }
>
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index 68d5886..d03be4a 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -1000,6 +1000,16 @@ retry_transaction:
> return 0;
> }
>
> +static int libxl__store_libxl_entry(libxl__gc *gc, uint32_t domid,
> + const char *name, const char *value)
> +{
> + char *path = NULL;
> +
> + path = libxl__xs_libxl_path(gc, domid);
> + path = libxl__sprintf(gc, "%s/%s", path, name);
> + return libxl__xs_write(gc, XBT_NULL, path, "%s", value);
> +}
> +
> static void spawn_stubdom_pvqemu_cb(libxl__egc *egc,
> libxl__dm_spawn_state *stubdom_dmss,
> int rc);
> @@ -1030,6 +1040,7 @@ void libxl__spawn_stub_dm(libxl__egc *egc,
> libxl__stub_dm_spawn_state *sdss)
> char **args;
> struct xs_permissions perm[2];
> xs_transaction_t t;
> + libxl_device_disk disk_stub;
>
> /* convenience aliases */
> libxl_domain_config *const dm_config = &sdss->dm_config;
> @@ -1038,10 +1049,14 @@ void libxl__spawn_stub_dm(libxl__egc *egc,
> libxl__stub_dm_spawn_state *sdss)
> libxl__domain_build_state *const d_state = sdss->dm.build_state;
> libxl__domain_build_state *const stubdom_state = &sdss->dm_state;
>
> - if (guest_config->b_info.device_model_version !=
> - LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL) {
> - ret = ERROR_INVAL;
> - goto out;
> + assert(libxl_defbool_val(guest_config->b_info.device_model_stubdomain));
> +
> + if (guest_config->b_info.stubdomain_version ==
> LIBXL_STUBDOMAIN_VERSION_LINUX) {
> + if (d_state->saved_state) {
> + LOG(ERROR, "Save/Restore not supported yet with Linux Stubdom.");
> + ret = -1;
> + goto out;
> + }
> }
>
> sdss->pvqemu.guest_domid = 0;
> @@ -1062,7 +1077,16 @@ void libxl__spawn_stub_dm(libxl__egc *egc,
> libxl__stub_dm_spawn_state *sdss)
> libxl_domain_build_info_init_type(&dm_config->b_info,
> LIBXL_DOMAIN_TYPE_PV);
>
> dm_config->b_info.max_vcpus = 1;
> - dm_config->b_info.max_memkb = 32 * 1024;
> + switch (guest_config->b_info.stubdomain_version) {
> + case LIBXL_STUBDOMAIN_VERSION_MINIOS:
> + dm_config->b_info.max_memkb = 32 * 1024;
> + break;
> + case LIBXL_STUBDOMAIN_VERSION_LINUX:
> + dm_config->b_info.max_memkb = LIBXL_LINUX_STUBDOM_MEM * 1024;
> + break;
> + default:
> + abort();
> + }
> dm_config->b_info.target_memkb = dm_config->b_info.max_memkb;
>
> dm_config->b_info.u.pv.features = "";
> @@ -1096,10 +1120,32 @@ void libxl__spawn_stub_dm(libxl__egc *egc,
> libxl__stub_dm_spawn_state *sdss)
> dm_config->vkbs = vkb;
> dm_config->num_vkbs = 1;
>
> - stubdom_state->pv_kernel.path
> - = libxl__abs_path(gc, "ioemu-stubdom.gz",
> libxl__xenfirmwaredir_path());
> - stubdom_state->pv_cmdline = libxl__sprintf(gc, " -d %d", guest_domid);
> - stubdom_state->pv_ramdisk.path = "";
> + switch (guest_config->b_info.stubdomain_version) {
> + case LIBXL_STUBDOMAIN_VERSION_MINIOS:
> + stubdom_state->pv_kernel.path
> + = libxl__abs_path(gc, "ioemu-stubdom.gz",
> libxl__xenfirmwaredir_path());
> + stubdom_state->pv_cmdline = libxl__sprintf(gc, " -d %d",
> guest_domid);
> + stubdom_state->pv_ramdisk.path = "";
> + break;
> + case LIBXL_STUBDOMAIN_VERSION_LINUX:
> + libxl_device_disk_init(&disk_stub);
> + disk_stub.readwrite = 0;
> + disk_stub.format = LIBXL_DISK_FORMAT_RAW;
> + disk_stub.is_cdrom = 0;
> + disk_stub.vdev = "xvdz";
I think that we need a way to translate guest disks into xvd? devices
within the linux stubdom. The function could also check if we have name
clashing with the stubdom own disk.
> + disk_stub.pdev_path = libxl__abs_path(gc, "stubdom-disk.img",
> + libxl__xenfirmwaredir_path());
> + ret = libxl__device_disk_setdefault(gc, &disk_stub);
> + if (ret) goto out;
> + stubdom_state->pv_kernel.path
> + = libxl__abs_path(gc, "vmlinuz-stubdom",
> libxl__xenfirmwaredir_path());
> + stubdom_state->pv_cmdline
> + = "debug console=hvc0 root=/dev/xvdz ro init=/init";
> + stubdom_state->pv_ramdisk.path = "";
> + break;
> + default:
> + abort();
> + }
>
> /* fixme: this function can leak the stubdom if it fails */
> ret = libxl__domain_make(gc, &dm_config->c_info,
> &sdss->pvqemu.guest_domid);
> @@ -1117,7 +1163,12 @@ void libxl__spawn_stub_dm(libxl__egc *egc,
> libxl__stub_dm_spawn_state *sdss)
> goto out;
> }
>
> - libxl__write_stub_dmargs(gc, dm_domid, guest_domid, args);
> + libxl__store_libxl_entry(gc, guest_domid, "dm-version",
> +
> libxl_device_model_version_to_string(dm_config->b_info.device_model_version));
> + libxl__store_libxl_entry(gc, dm_domid, "stubdom-version",
> +
> libxl_stubdomain_version_to_string(guest_config->b_info.stubdomain_version));
> + libxl__write_stub_dmargs(gc, dm_domid, guest_domid, args,
> + guest_config->b_info.stubdomain_version ==
> LIBXL_STUBDOMAIN_VERSION_LINUX);
> libxl__xs_write(gc, XBT_NULL,
> libxl__sprintf(gc, "%s/image/device-model-domid",
> libxl__xs_get_dompath(gc, guest_domid)),
> @@ -1126,6 +1177,15 @@ void libxl__spawn_stub_dm(libxl__egc *egc,
> libxl__stub_dm_spawn_state *sdss)
> libxl__sprintf(gc, "%s/target",
> libxl__xs_get_dompath(gc, dm_domid)),
> "%d", guest_domid);
> + if (guest_config->b_info.stubdomain_version ==
> LIBXL_STUBDOMAIN_VERSION_LINUX) {
> + /* qemu-xen is used as a dm in the stubdomain, so we set the bios
> + * accroding to this */
> + libxl__xs_write(gc, XBT_NULL,
> + libxl__sprintf(gc, "%s/hvmloader/bios",
> + libxl__xs_get_dompath(gc,
> guest_domid)),
> + "%s",
> + libxl_bios_type_to_string(LIBXL_BIOS_TYPE_SEABIOS));
Why is this QEMU upstream specific?
> + }
> ret = xc_domain_set_target(ctx->xch, dm_domid, guest_domid);
> if (ret<0) {
> LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
> @@ -1153,6 +1213,10 @@ retry_transaction:
>
> libxl__multidev_begin(ao, &sdss->multidev);
> sdss->multidev.callback = spawn_stub_launch_dm;
> + if (guest_config->b_info.stubdomain_version ==
> LIBXL_STUBDOMAIN_VERSION_LINUX) {
> + libxl__ao_device *aodev = libxl__multidev_prepare(&sdss->multidev);
> + libxl__device_disk_add(egc, dm_domid, &disk_stub, aodev);
> + }
> libxl__add_disks(egc, ao, dm_domid, dm_config, &sdss->multidev);
> libxl__multidev_prepared(egc, &sdss->multidev, 0);
>
> @@ -1201,6 +1265,10 @@ static void spawn_stub_launch_dm(libxl__egc *egc,
> if (ret)
> goto out;
>
> + if (guest_config->b_info.stubdomain_version ==
> LIBXL_STUBDOMAIN_VERSION_LINUX) {
> + /* no special console for save/restore, only the logging console */
> + num_console = 1;
> + }
> if (guest_config->b_info.u.hvm.serial)
> num_console++;
>
> @@ -1229,14 +1297,20 @@ static void spawn_stub_launch_dm(libxl__egc *egc,
> free(filename);
> break;
> case STUBDOM_CONSOLE_SAVE:
> - console[i].output = libxl__sprintf(gc, "file:%s",
> - libxl__device_model_savefile(gc,
> guest_domid));
> - break;
> + if (guest_config->b_info.stubdomain_version
> + == LIBXL_STUBDOMAIN_VERSION_MINIOS) {
> + console[i].output = libxl__sprintf(gc, "file:%s",
> + libxl__device_model_savefile(gc, guest_domid));
> + break;
> + }
> case STUBDOM_CONSOLE_RESTORE:
> - if (d_state->saved_state)
> - console[i].output =
> - libxl__sprintf(gc, "pipe:%s", d_state->saved_state);
> - break;
> + if (guest_config->b_info.stubdomain_version
> + == LIBXL_STUBDOMAIN_VERSION_MINIOS) {
> + if (d_state->saved_state)
> + console[i].output =
> + libxl__sprintf(gc, "pipe:%s",
> d_state->saved_state);
> + break;
> + }
> default:
> console[i].output = "pty";
> break;
> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
> index ddc68ab..d38e23d 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -364,6 +364,28 @@ int libxl__device_model_version_running(libxl__gc *gc,
> uint32_t domid)
> return value;
> }
>
> +int libxl__stubdomain_version_running(libxl__gc *gc, uint32_t domid)
> +{
> + char *path = NULL;
> + char *stub_version = NULL;
> + libxl_stubdomain_version value;
> +
> + path = libxl__xs_libxl_path(gc, domid);
> + path = libxl__sprintf(gc, "%s/stubdom-version", path);
> + stub_version = libxl__xs_read(gc, XBT_NULL, path);
> + if (!stub_version) {
> + return LIBXL_STUBDOMAIN_VERSION_MINIOS;
> + }
> +
> + if (libxl_stubdomain_version_from_string(stub_version, &value) < 0) {
> + libxl_ctx *ctx = libxl__gc_owner(gc);
> + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + "fatal: %s contain a wrong value (%s)", path,
> stub_version);
> + return -1;
> + }
> + return value;
> +}
> +
> int libxl__hotplug_settings(libxl__gc *gc, xs_transaction_t t)
> {
> int rc = 0;
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 934465a..8755022 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -102,6 +102,7 @@
> #define STUBDOM_CONSOLE_RESTORE 2
> #define STUBDOM_CONSOLE_SERIAL 3
> #define STUBDOM_SPECIAL_CONSOLES 3
> +#define LIBXL_LINUX_STUBDOM_MEM 128
> #define TAP_DEVICE_SUFFIX "-emu"
> #define DISABLE_UDEV_PATH "libxl/disable_udev"
> #define DOMID_XS_PATH "domid"
> @@ -1794,6 +1795,9 @@ _hidden libxl__json_object *libxl__json_parse(libxl__gc
> *gc_opt, const char *s);
> _hidden int libxl__device_model_version_running(libxl__gc *gc, uint32_t
> domid);
> /* Return the system-wide default device model */
> _hidden libxl_device_model_version libxl__default_device_model(libxl__gc
> *gc);
> + /* Based on /libxl/$domid/stubdom-version xenstore key
> + * default is minios */
> +_hidden int libxl__stubdomain_version_running(libxl__gc *gc, uint32_t domid);
>
> /* Check how executes hotplug script currently */
> int libxl__hotplug_settings(libxl__gc *gc, xs_transaction_t t);
> --
> 1.8.5.5
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |