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

Re: [Xen-devel] [PATCH v3 1/2] libxc: introduce XC_SAVE_ID_TOOLSTACK



On Wed, 1 Feb 2012, Shriram Rajagopalan wrote:
> On 2012-02-01, at 5:53 AM, Stefano Stabellini 
> <stefano.stabellini@xxxxxxxxxxxxx> wrote:
> 
> > All your comments make perfect sense, so I made all the changes you
> > suggested.
> > 
> > 8<---
> > 
> > 
> > diff --git a/tools/libxc/xc_domain_restore.c 
> > b/tools/libxc/xc_domain_restore.c
> > index 3fda6f8..958534c 100644
> > --- a/tools/libxc/xc_domain_restore.c
> > +++ b/tools/libxc/xc_domain_restore.c
> > @@ -659,6 +659,11 @@ static void tailbuf_free(tailbuf_t *buf)
> >         tailbuf_free_pv(&buf->u.pv);
> > }
> > 
> > +struct toolstack_data_t {
> > +    uint8_t *data;
> > +    uint32_t len;
> > +};
> > +
> > typedef struct {
> >     void* pages;
> >     /* pages is of length nr_physpages, pfn_types is of length nr_pages */
> > @@ -682,6 +687,8 @@ typedef struct {
> >     uint64_t acpi_ioport_location;
> >     uint64_t viridian;
> >     uint64_t vm_generationid_addr;
> > +
> > +    struct toolstack_data_t tdata;
> > } pagebuf_t;
> > 
> > static int pagebuf_init(pagebuf_t* buf)
> > @@ -692,6 +699,10 @@ static int pagebuf_init(pagebuf_t* buf)
> > 
> > static void pagebuf_free(pagebuf_t* buf)
> > {
> > +    if (buf->tdata.data != NULL) {
> > +        free(buf->tdata.data);
> > +        buf->tdata.data = NULL;
> > +    }
> >     if (buf->pages) {
> >         free(buf->pages);
> >         buf->pages = NULL;
> > @@ -827,6 +838,19 @@ static int pagebuf_get_one(xc_interface *xch, struct 
> > restore_ctx *ctx,
> >         }
> >         return pagebuf_get_one(xch, ctx, buf, fd, dom);
> > 
> > +    case XC_SAVE_ID_TOOLSTACK:
> > +        {
> > +            RDEXACT(fd, &buf->tdata.len, sizeof(buf->tdata.len));
> > +            buf->tdata.data = (uint8_t*) realloc(buf->tdata.data, 
> > buf->tdata.len);
> > +            if ( buf->tdata.data == NULL )
> > +            {
> > +                PERROR("error memory allocation");
> > +                return -1;
> > +            }
> > +            RDEXACT(fd, buf->tdata.data, buf->tdata.len);
> > +            return pagebuf_get_one(xch, ctx, buf, fd, dom);
> > +        }
> > +
> >     case XC_SAVE_ID_ENABLE_COMPRESSION:
> >         /* We cannot set compression flag directly in pagebuf structure,
> >          * since this pagebuf still has uncompressed pages that are yet to
> > @@ -1262,7 +1286,8 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
> > uint32_t dom,
> >                       unsigned int console_evtchn, unsigned long 
> > *console_mfn,
> >                       unsigned int hvm, unsigned int pae, int superpages,
> >                       int no_incr_generationid,
> > -                      unsigned long *vm_generationid_addr)
> > +                      unsigned long *vm_generationid_addr,
> > +                      struct restore_callbacks *callbacks)
> > {
> >     DECLARE_DOMCTL;
> >     int rc = 1, frc, i, j, n, m, pae_extended_cr3 = 0, ext_vcpucontext = 0;
> > @@ -1310,6 +1335,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
> > uint32_t dom,
> > 
> >     pagebuf_t pagebuf;
> >     tailbuf_t tailbuf, tmptail;
> > +    struct toolstack_data_t tdata, tdatatmp;
> >     void* vcpup;
> >     uint64_t console_pfn = 0;
> > 
> > @@ -1322,6 +1348,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
> > uint32_t dom,
> >     pagebuf_init(&pagebuf);
> >     memset(&tailbuf, 0, sizeof(tailbuf));
> >     tailbuf.ishvm = hvm;
> > +    memset(&tdata, 0, sizeof(tdata));
> > 
> >     memset(ctx, 0, sizeof(*ctx));
> > 
> > @@ -1581,6 +1608,10 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
> > uint32_t dom,
> >         ERROR("Error, unknow acpi ioport location (%i)", 
> > pagebuf.acpi_ioport_location);
> >     }
> > 
> > +    tdatatmp = tdata;
> > +    tdata = pagebuf.tdata;
> > +    pagebuf.tdata = tdatatmp;
> > +
> >     if ( ctx->last_checkpoint )
> >     {
> >         // DPRINTF("Last checkpoint, finishing\n");
> > @@ -2023,6 +2054,19 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
> > uint32_t dom,
> >     goto out;
> > 
> >   finish_hvm:
> > +    if ( callbacks != NULL && callbacks->toolstack_restore != NULL &&
> > +            tdata.data != NULL )
> > +    {
> > +        if ( callbacks->toolstack_restore(dom, tdata.data, tdata.len,
> > +                    callbacks->data) < 0 )
> > +        {
> > +            PERROR("error calling toolstack_restore");
> > +            free(tdata.data);
> > +            goto out;
> > +        }
> > +    }
> > +    free(tdata.data);
> > +
> >     /* Dump the QEMU state to a state file for QEMU to load */
> >     if ( dump_qemu(xch, dom, &tailbuf.u.hvm) ) {
> >         PERROR("Error dumping QEMU state to file");
> > diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
> > index f473dd7..318c433 100644
> > --- a/tools/libxc/xc_domain_save.c
> > +++ b/tools/libxc/xc_domain_save.c
> > @@ -1687,6 +1687,23 @@ int xc_domain_save(xc_interface *xch, int io_fd, 
> > uint32_t dom, uint32_t max_iter
> >         }
> >     }
> > 
> > +    if ( callbacks != NULL && callbacks->toolstack_save != NULL )
> > +    {
> > +        int id = XC_SAVE_ID_TOOLSTACK;
> > +        uint8_t *buf;
> > +        uint32_t len;
> > +
> > +        if ( callbacks->toolstack_save(dom, &buf, &len, callbacks->data) < 
> > 0 )
> > +        {
> > +            PERROR("Error calling toolstack_save");
> > +            goto out;
> > +        }
> > +        wrexact(io_fd, &id, sizeof(id));
> > +        wrexact(io_fd, &len, sizeof(len));
> > +        wrexact(io_fd, buf, len);
> > +        free(buf);
> > +    }
> > +
> >     if ( !callbacks->checkpoint )
> >     {
> >         /*
> > diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h
> > index 6026370..76aa475 100644
> > --- a/tools/libxc/xenguest.h
> > +++ b/tools/libxc/xenguest.h
> > @@ -44,6 +44,14 @@ struct save_callbacks {
> >     /* Enable qemu-dm logging dirty pages to xen */
> >     int (*switch_qemu_logdirty)(int domid, unsigned enable, void *data); /* 
> > HVM only */
> > 
> > +    /* Save toolstack specific data
> > +     * @param buf the buffer with the data to be saved
> > +     * @param len the length of the buffer
> > +     * The callee allocates the buffer, the caller frees it (buffer must
> > +     * be free'able).
> > +     */
> > +    int (*toolstack_save)(uint32_t domid, uint8_t **buf, uint32_t *len, 
> > void *data);
> > +
> >     /* to be provided as the last argument to each callback function */
> >     void* data;
> > };
> > @@ -62,6 +70,16 @@ int xc_domain_save(xc_interface *xch, int io_fd, 
> > uint32_t dom, uint32_t max_iter
> >                    unsigned long vm_generationid_addr);
> > 
> > 
> > +/* callbacks provided by xc_domain_restore */
> > +struct restore_callbacks {
> > +    /* callback to restore toolstack specific data */
> > +    int (*toolstack_restore)(uint32_t domid, uint8_t *buf,
> > +            uint32_t size, void* data);
> > +
> > +    /* to be provided as the last argument to each callback function */
> > +    void* data;
> > +};
> > +
> > /**
> >  * This function will restore a saved domain.
> >  *
> > @@ -75,6 +93,8 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t 
> > dom, uint32_t max_iter
> >  * @parm superpages non-zero to allocate guest memory with superpages
> >  * @parm no_incr_generationid non-zero if generation id is NOT to be 
> > incremented
> >  * @parm vm_generationid_addr returned with the address of the generation 
> > id buffer
> > + * @parm callbacks non-NULL to receive a callback to restore toolstack
> > + *       specific data
> >  * @return 0 on success, -1 on failure
> >  */
> > int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
> > @@ -82,7 +102,8 @@ int xc_domain_restore(xc_interface *xch, int io_fd, 
> > uint32_t dom,
> >                       unsigned int console_evtchn, unsigned long 
> > *console_mfn,
> >                       unsigned int hvm, unsigned int pae, int superpages,
> >                       int no_incr_generationid,
> > -              unsigned long *vm_generationid_addr);
> > +                      unsigned long *vm_generationid_addr,
> > +                      struct restore_callbacks *callbacks);
> > /**
> >  * xc_domain_restore writes a file to disk that contains the device
> >  * model saved state.
> > diff --git a/tools/libxc/xg_save_restore.h b/tools/libxc/xg_save_restore.h
> > index 6286b68..46fdeaa 100644
> > --- a/tools/libxc/xg_save_restore.h
> > +++ b/tools/libxc/xg_save_restore.h
> > @@ -254,6 +254,7 @@
> > #define XC_SAVE_ID_COMPRESSED_DATA    -12 /* Marker to indicate arrival of 
> > compressed data */
> > #define XC_SAVE_ID_ENABLE_COMPRESSION -13 /* Marker to enable compression 
> > logic at receiver side */
> > #define XC_SAVE_ID_HVM_GENERATION_ID_ADDR -14
> > +#define XC_SAVE_ID_TOOLSTACK          -15 /* Optional toolstack specific 
> > info */
> > 
> > /*
> > ** We process save/restore/migrate in batches of pages; the below
> > diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> > index 91643a2..2c5eec5 100644
> > --- a/tools/libxl/libxl_dom.c
> > +++ b/tools/libxl/libxl_dom.c
> > @@ -379,7 +379,7 @@ int libxl__domain_restore_common(libxl__gc *gc, 
> > uint32_t domid,
> >                            state->store_port, &state->store_mfn,
> >                            state->console_port, &state->console_mfn,
> >                            hvm, pae, superpages, no_incr_generationid,
> > -                           &state->vm_generationid_addr);
> > +                           &state->vm_generationid_addr, NULL);
> >     if ( rc ) {
> >         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "restoring domain");
> >         return ERROR_FAIL;
> > diff --git a/tools/xcutils/xc_restore.c b/tools/xcutils/xc_restore.c
> > index 63d53a8..306a10e 100644
> > --- a/tools/xcutils/xc_restore.c
> > +++ b/tools/xcutils/xc_restore.c
> > @@ -47,7 +47,7 @@ main(int argc, char **argv)
> > 
> >     ret = xc_domain_restore(xch, io_fd, domid, store_evtchn, &store_mfn,
> >                             console_evtchn, &console_mfn, hvm, pae, 
> > superpages,
> > -                            0, NULL);
> > +                            0, NULL, NULL);
> > 
> >     if ( ret == 0 )
> >     {
> > 
> 
> Acked-by: Shriram Rajagopalan <rshriram@xxxxxxxxx>
> 

Thanks, I'll resend the patch with a proper commit message.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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