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