[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 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>


_______________________________________________
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®.