[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH V3] libxl: write IO ABI for disk frontends



On Fri, 2013-04-26 at 10:44 +0100, Wei Liu wrote:
> On Fri, Apr 26, 2013 at 10:18:51AM +0100, Ian Campbell wrote:
> > On Thu, 2013-04-25 at 22:36 +0100, Wei Liu wrote:
> > > @@ -2156,6 +2166,24 @@ 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 kernel disk frontends before 2.6.26 rely on tool stack 
> > > to
> > > +         * write disk native protocol to frontend node. Xend does this, 
> > > port
> > > +         * this behaviour to xl.
> > > +         *
> > > +         * New kernels write this node themselves. In that case it just
> > > +         * overwrites an existing node which is OK.
> > > +         */
> > > +        if (type == LIBXL_DOMAIN_TYPE_PV) {
> > > +            protocol = xc_domain_get_native_protocol(ctx->xch, domid);
> > 
> > You can declare protocol here instead of globally in the function. The =
> > NULL is also redundant.
> > 
> > > +            if (protocol) {
> > > +                strncpy(p, protocol, strlen(protocol));
> > > +                p[strlen(protocol)] = 0;
> > > +                flexarray_append(front, "protocol");
> > > +                flexarray_append(front, p);
> > 
> > GCSPRINTF would be the right way to do this, but actually you can pass
> > protocol directly to flexarray_append, that is fine since the flexarray
> > never frees the values which it contains so they either need to be gc'd,
> > string constants or managed manually.
> > 
> 
> Oh thanks for the hint. This saves serveral lines of code. The (void *)
> argument of flexarray_append misled me. ;-)
> 
> Below is updated version of the patch. Casting "protocol" to (void *) is
> necessary to have it compiled. Otherwise gcc complains we discard the
> const quilifier.

Oh, sorry, if this is the case the libxl__strdup(gc,protocol) is better
than the cast. Sorry for misleading :-(

Now you mention it I do seem to recall trying to correctly constify
flexarray's at one point and not quite being able to make it work.

Ian.

> 
> 
> Wei.
> 
> -----------8<--------
> commit 7961cfe75b1282a2d27163a04ff268cedf4919b5
> Author: Wei Liu <wei.liu2@xxxxxxxxxx>
> Date:   Wed Apr 24 19:00:01 2013 +0100
> 
>     libxl: write IO ABI for disk frontends
>     
>     This is a patch to forward-port a Xend behaviour. Xend writes IO ABI used 
> for
>     all frontends. Blkfront before 2.6.26 relies on this behaviour otherwise 
> guest
>     cannot boot when running in 32-on-64 mode. Blkfront after 2.6.26 writes 
> that
>     node itself, in which case it's just an overwrite to an existing node 
> which
>     should be OK.
>     
>     In fact Xend writes the ABI for all frontends including console and vif. 
> But
>     nowadays only old disk frontends rely on that behaviour so that we only 
> write
>     the ABI for disk frontends in libxl, minimizing the impact.
>     
>     Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
>     Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
>     Cc: Roger Pau Monne <roger.pau@xxxxxxxxxx>
>     Cc: Valtteri Kiviniemi <kiviniemi.valtteri@xxxxxxxxx>
> 
> diff --git a/tools/libxc/xc_dom_arm.c b/tools/libxc/xc_dom_arm.c
> index 041832e..aaf35ca 100644
> --- a/tools/libxc/xc_dom_arm.c
> +++ b/tools/libxc/xc_dom_arm.c
> @@ -29,6 +29,13 @@
>  #define CONSOLE_PFN_OFFSET 0
>  #define XENSTORE_PFN_OFFSET 1
>  
> +/* get guest IO ABI protocol */
> +const char *xc_domain_get_native_protocol(xc_interface *xch,
> +                                          uint32_t domid)
> +{
> +    return XEN_IO_PROTO_ABI_ARM;
> +}
> +
>  /* ------------------------------------------------------------------------ 
> */
>  /*
>   * arm guests are hybrid and start off with paging disabled, therefore no
> diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c
> index eb9ac07..84a8de6 100644
> --- a/tools/libxc/xc_dom_x86.c
> +++ b/tools/libxc/xc_dom_x86.c
> @@ -47,6 +47,40 @@
>  #define round_down(addr, mask)   ((addr) & ~(mask))
>  #define round_up(addr, mask)     ((addr) | (mask))
>  
> +/* get guest IO ABI protocol */
> +const char *xc_domain_get_native_protocol(xc_interface *xch,
> +                                          uint32_t domid)
> +{
> +    int ret;
> +    uint32_t guest_width;
> +    const char *protocol;
> +    DECLARE_DOMCTL;
> +
> +    memset(&domctl, 0, sizeof(domctl));
> +    domctl.domain = domid;
> +    domctl.cmd = XEN_DOMCTL_get_address_size;
> +
> +    ret = do_domctl(xch, &domctl);
> +
> +    if ( ret )
> +        return NULL;
> +
> +    guest_width = domctl.u.address_size.size;
> +
> +    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:
> +        protocol = NULL;
> +    }
> +
> +    return protocol;
> +}
> +
>  static unsigned long
>  nr_page_tables(struct xc_dom_image *dom,
>                 xen_vaddr_t start, xen_vaddr_t end, unsigned long bits)
> diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
> index 50853af..2f32151 100644
> --- a/tools/libxc/xenctrl.h
> +++ b/tools/libxc/xenctrl.h
> @@ -637,6 +637,16 @@ int xc_domain_hvm_setcontext(xc_interface *xch,
>                               uint32_t size);
>  
>  /**
> + * This function will return guest IO ABI protocol
> + *
> + * @parm xch a handle to an open hypervisor interface
> + * @parm domid the domain to get IO ABI protocol for
> + * @return guest protocol on success, NULL on failure
> + */
> +const char *xc_domain_get_native_protocol(xc_interface *xch,
> +                                          uint32_t domid);
> +
> +/**
>   * 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..9013932 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -2038,6 +2038,12 @@ static void device_disk_add(libxl__egc *egc, uint32_t 
> domid,
>      libxl_ctx *ctx = gc->owner;
>      xs_transaction_t t = XBT_NULL;
>  
> +    libxl_domain_type type = libxl__domain_type(gc, domid);
> +    if (type == LIBXL_DOMAIN_TYPE_INVALID) {
> +        rc = ERROR_FAIL;
> +        goto out;
> +    }
> +
>      for (;;) {
>          rc = libxl__xs_transaction_start(gc, &t);
>          if (rc) goto out;
> @@ -2156,6 +2162,23 @@ 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 kernel disk frontends before 2.6.26 rely on tool stack to
> +         * write disk native protocol to frontend node. Xend does this, port
> +         * this behaviour to xl.
> +         *
> +         * New kernels write this node themselves. In that case it just
> +         * overwrites an existing node which is OK.
> +         */
> +        if (type == LIBXL_DOMAIN_TYPE_PV) {
> +            const char *protocol =
> +                xc_domain_get_native_protocol(ctx->xch, domid);
> +            if (protocol) {
> +                flexarray_append(front, "protocol");
> +                flexarray_append(front, (void *)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));



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.