[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |