[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] libxl: write IO ABI for disk frontends
Hi, adding Valtteri to CC because he originally reported the problem.. -- Pasi On Tue, Apr 23, 2013 at 09:25:54PM +0100, Wei Liu wrote: > This is a patch to forward-port a Xend behaviour. Xend writes IO ABI used for > all frontends. Linux kernel before 2.6.26 relies on this behaviour otherwise > it cannot boot. Blkfront after 2.6.26 writes that node itself, in which case > it's just an overwrite of the existing node which should be OK. > > In fact Xend writes the ABI for all frontends including console and vif. But > nowadays it seems only old disk frontends rely on that ABI node so that we > only write the ABI for disk frontends in libxl, minimizing the impact. Also > ARM guests should not have this problem because they have new disk frontend so > the snippets of this workaround are compiled for X86 target only. > > Also cleaned up trailing whitespaces while I was there. > > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> > --- > tools/libxc/xc_domain.c | 20 ++++++++++++++++++ > tools/libxc/xenctrl.h | 14 +++++++++++++ > tools/libxl/libxl.c | 12 +++++++++++ > tools/libxl/libxl_create.c | 49 > +++++++++++++++++++++++++++++++++++++++++++ > tools/libxl/libxl_types.idl | 7 ++++--- > 5 files changed, 99 insertions(+), 3 deletions(-) > > diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c > index 480ce91..c3d8e28 100644 > --- a/tools/libxc/xc_domain.c > +++ b/tools/libxc/xc_domain.c > @@ -379,6 +379,26 @@ int xc_domain_hvm_setcontext(xc_interface *xch, > return ret; > } > > +#if defined (__i386__) || (__x86_64__) > +/* get guest word width */ > +int xc_domain_getwidth(xc_interface *xch, > + uint32_t domid, > + uint32_t *guest_width) > +{ > + int ret; > + DECLARE_DOMCTL; > + > + domctl.domain = domid; > + domctl.cmd = XEN_DOMCTL_get_address_size; > + > + ret = do_domctl(xch, &domctl); > + > + *guest_width = domctl.u.address_size.size; > + > + return ret; > +} > +#endif > + > int xc_vcpu_getcontext(xc_interface *xch, > uint32_t domid, > uint32_t vcpu, > diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h > index 50853af..c02dc1f 100644 > --- a/tools/libxc/xenctrl.h > +++ b/tools/libxc/xenctrl.h > @@ -636,6 +636,20 @@ int xc_domain_hvm_setcontext(xc_interface *xch, > uint8_t *hvm_ctxt, > uint32_t size); > > +#if defined (__i386__) || (__x86_64__) > +/** > + * This function will return the guest word width > + * > + * @parm xch a handle to an open hypervisor interface > + * @parm domid the domain to get address width for > + * @parm guest_width word width for guest > + * @return 0 on success, -ev on failure > + */ > +int xc_domain_getwidth(xc_interface *xch, > + uint32_t domid, > + uint32_t *guest_width); > +#endif > + > /** > * This function returns information about the execution context of a > * particular vcpu of a domain. > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > index 572c2c6..5b8c9dc 100644 > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -2156,6 +2156,18 @@ static void device_disk_add(libxl__egc *egc, uint32_t > domid, > flexarray_append(front, "device-type"); > flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk"); > > + /* > + * Old PV kernels before 2.6.26 rely on tool stack to write disk > native > + * protocol to frontend node. > + * > + * New kernels write this node themselves. In that case it just > + * overwrites an existing node which is OK. > + */ > + if (disk->native_protocol) { > + flexarray_append(front, "protocol"); > + flexarray_append(front, disk->native_protocol); > + } > + > libxl__device_generic_add(gc, t, device, > libxl__xs_kvs_of_flexarray(gc, back, > back->count), > libxl__xs_kvs_of_flexarray(gc, front, > front->count)); > diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c > index 30a4507..7abcaf9 100644 > --- a/tools/libxl/libxl_create.c > +++ b/tools/libxl/libxl_create.c > @@ -23,6 +23,7 @@ > #include <xc_dom.h> > #include <xenguest.h> > #include <xen/hvm/hvm_info_table.h> > +#include <xen/io/protocols.h> > > int libxl__domain_create_info_setdefault(libxl__gc *gc, > libxl_domain_create_info *c_info) > @@ -910,6 +911,54 @@ static void domcreate_rebuild_done(libxl__egc *egc, > goto error_out; > } > > +#if defined (__i386__) || (__x86_64__) > + /* > + * Pass along the disk navtive protocol to disks so that the protocol can > + * be written to frontend Xenstore node. This is a workaround for old PV > + * kernels before 2.6.26. > + * > + * Newer blkfront will write that node itself. In that case frontend just > + * rewrites the node as it sees fit. > + * > + * Note that Xend actually propagate this vaule to all frontends > including > + * console and vifs. As now this is only needed for disk frontend so here > + * we minimize the impact. > + * > + * Presumably ARM guests don't have this problem, so this snippet is only > + * compiled for X86 target. > + */ > + > + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV) { > + int i; > + uint32_t guest_width; > + const char *protocol = NULL; > + > + ret = xc_domain_getwidth(CTX->xch, domid, &guest_width); > + if (ret) { > + ret = ERROR_FAIL; > + goto error_out; > + } > + > + switch (guest_width) { > + case 32: /* 32 bit guest */ > + protocol = XEN_IO_PROTO_ABI_X86_32; > + break; > + case 64: /* 64 bit guest */ > + protocol = XEN_IO_PROTO_ABI_X86_64; > + break; > + default: > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, > + "invalid address size for domain: %u", > + guest_width); > + ret = ERROR_FAIL; > + goto error_out; > + } > + > + for (i = 0; i < d_config->num_disks; i++) > + d_config->disks[i].native_protocol = strdup(protocol); > + } > +#endif > + > store_libxl_entry(gc, domid, &d_config->b_info); > > libxl__multidev_begin(ao, &dcs->multidev); > diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl > index 6cb6de6..22622a9 100644 > --- a/tools/libxl/libxl_types.idl > +++ b/tools/libxl/libxl_types.idl > @@ -274,7 +274,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ > ("disable_migrate", libxl_defbool), > ("cpuid", libxl_cpuid_policy_list), > ("blkdev_start", string), > - > + > ("device_model_version", libxl_device_model_version), > ("device_model_stubdomain", libxl_defbool), > # if you set device_model you must set device_model_version too > @@ -318,9 +318,9 @@ libxl_domain_build_info = Struct("domain_build_info",[ > ("keymap", string), > ("sdl", libxl_sdl_info), > ("spice", > libxl_spice_info), > - > + > ("gfx_passthru", libxl_defbool), > - > + > ("serial", string), > ("boot", string), > ("usb", libxl_defbool), > @@ -371,6 +371,7 @@ libxl_device_disk = Struct("device_disk", [ > ("removable", integer), > ("readwrite", integer), > ("is_cdrom", integer), > + ("native_protocol", string), > ]) > > libxl_device_nic = Struct("device_nic", [ > -- > 1.7.10.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |