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