[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 31/31] libxl: allow the creation of HVM domains without a device model.
On Fri, Aug 07, 2015 at 12:18:08PM +0200, Roger Pau Monne wrote: > Replace the firmware loaded into HVM guests with an OS kernel. Since the HVM > builder now uses the PV xc_dom_* set of functions this kernel will be parsed > and loaded inside the guest like on PV, but the container is a pure HVM > guest. > > Also, if device_model_version is set to none or a device model for the > specified domain is not present unconditinally set the nic type to > LIBXL_NIC_TYPE_VIF. > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> > Cc: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > Cc: Ian Campbell <ian.campbell@xxxxxxxxxx> > Cc: Wei Liu <wei.liu2@xxxxxxxxxx> > --- > Changes since v3: > - Add explicit /* fall through */ comments. > - Expand libxl__device_nic_setdefault so that it sets the right nic type > for HVMlite guests. > - Remove stray space in hvm_build_set_params. > - Fix the error paths of libxl__domain_firmware. > --- > docs/man/xl.cfg.pod.5 | 5 ++++ > tools/libxc/xc_dom_x86.c | 7 +++++ > tools/libxl/libxl.c | 39 ++++++++++++++----------- > tools/libxl/libxl_create.c | 16 ++++++++++- > tools/libxl/libxl_dm.c | 13 ++++++++- > tools/libxl/libxl_dom.c | 68 > ++++++++++++++++++++++++++++++-------------- > tools/libxl/libxl_internal.h | 5 +++- > tools/libxl/libxl_types.idl | 1 + > tools/libxl/libxl_x86.c | 4 ++- > tools/libxl/xl_cmdimpl.c | 2 ++ > 10 files changed, 118 insertions(+), 42 deletions(-) > > diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 > index 80e51bb..8cd7726 100644 > --- a/docs/man/xl.cfg.pod.5 > +++ b/docs/man/xl.cfg.pod.5 > @@ -1741,6 +1741,11 @@ This device-model is the default for Linux dom0. > Use the device-model based upon the historical Xen fork of Qemu. > This device-model is still the default for NetBSD dom0. > > +=item B<none> > + > +Don't use any device model. This requires a kernel capable of booting > +in this mode. booting without emulated devices? > + > =back > > It is recommended to accept the default value for new guests. If > diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c > index 1599de4..d67feb0 100644 > --- a/tools/libxc/xc_dom_x86.c > +++ b/tools/libxc/xc_dom_x86.c > @@ -1269,6 +1269,13 @@ static int meminit_hvm(struct xc_dom_image *dom) > if ( nr_pages > target_pages ) > memflags |= XENMEMF_populate_on_demand; > > + /* Make sure there's a MMIO hole for the special pages. */ > + if ( dom->mmio_size == 0 ) > + { > + dom->mmio_size = NR_SPECIAL_PAGES << PAGE_SHIFT; > + dom->mmio_start = special_pfn(0); > + } > + Better to just assert(dom->mmio_size != 0); It's really libxl's responsibility to generate memory layout for guest. Libxc doesn't have all information to make the decision. > if ( dom->nr_vmemranges == 0 ) > { > /* Build dummy vnode information > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > index 083f099..a01868a 100644 > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -1033,11 +1033,13 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t > domid) > } > > if (type == LIBXL_DOMAIN_TYPE_HVM) { > - rc = libxl__domain_resume_device_model(gc, domid); > - if (rc < 0) { > - LOG(ERROR, "failed to unpause device model for domain %u:%d", > - domid, rc); > - goto out; > + if (libxl__domain_has_device_model(gc, domid)) { Checking for device model version is not enough? > + rc = libxl__domain_resume_device_model(gc, domid); > + if (rc < 0) { > + LOG(ERROR, "failed to unpause device model for domain %u:%d", > + domid, rc); > + goto out; > + } > } > } > ret = xc_domain_unpause(ctx->xch, domid); > @@ -1567,7 +1569,6 @@ void libxl__destroy_domid(libxl__egc *egc, > libxl__destroy_domid_state *dis) > libxl_ctx *ctx = CTX; > uint32_t domid = dis->domid; > char *dom_path; > - char *pid; > int rc, dm_present; > > libxl__ev_child_init(&dis->destroyer); > @@ -1584,14 +1585,13 @@ void libxl__destroy_domid(libxl__egc *egc, > libxl__destroy_domid_state *dis) > > switch (libxl__domain_type(gc, domid)) { > case LIBXL_DOMAIN_TYPE_HVM: > - if (!libxl_get_stubdom_id(CTX, domid)) > - dm_present = 1; > - else > + if (libxl_get_stubdom_id(CTX, domid)) { > dm_present = 0; > - break; > + break; > + } > + /* fall through */ > case LIBXL_DOMAIN_TYPE_PV: > - pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, > "/local/domain/%d/image/device-model-pid", domid)); > - dm_present = (pid != NULL); > + dm_present = libxl__domain_has_device_model(gc, domid); > break; > case LIBXL_DOMAIN_TYPE_INVALID: > rc = ERROR_FAIL; > @@ -3203,7 +3203,7 @@ out: > > /******************************************************************************/ > > int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, > - uint32_t domid) > + uint32_t domid, libxl_domain_build_info > *info) > { > int rc; > > @@ -3240,8 +3240,15 @@ int libxl__device_nic_setdefault(libxl__gc *gc, > libxl_device_nic *nic, > > switch (libxl__domain_type(gc, domid)) { > case LIBXL_DOMAIN_TYPE_HVM: > - if (!nic->nictype) > - nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; > + if (!nic->nictype) { > + if (info != NULL && > + info->device_model_version != > LIBXL_DEVICE_MODEL_VERSION_NONE) > + nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; > + else if (libxl__domain_has_device_model(gc, domid)) > + nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; > + else > + nic->nictype = LIBXL_NIC_TYPE_VIF; I think all you need is to pass in device model version and if version != none nictype = ioemu else nictype = vif ? Otherwise the code suggests that there can be case you have specified a device model when creating a domain but it somehow disappears when domain is running? Wei. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |