From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH v4 14/14] libxc/restore: split read/handle qemu info Date: Tue, 12 May 2015 13:20:01 +0100 Message-ID: <5551EFF1.9040805@citrix.com> References: <1431429922-15344-1-git-send-email-yanghy@cn.fujitsu.com> <1431429922-15344-15-git-send-email-yanghy@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1431429922-15344-15-git-send-email-yanghy@cn.fujitsu.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Yang Hongyang , xen-devel@lists.xen.org Cc: wei.liu2@citrix.com, ian.campbell@citrix.com, wency@cn.fujitsu.com, ian.jackson@eu.citrix.com, yunhong.jiang@intel.com, eddie.dong@intel.com, rshriram@cs.ubc.ca List-Id: xen-devel@lists.xenproject.org On 12/05/15 12:25, Yang Hongyang wrote: > Split read/handle qemu info. The receiving of qemu info > should be done while we receive the migration stream, > handle_qemu will be called when the stream complete. > Otherwise, it will break Remus because read_record() > won't read qemu info and stream_complete will be called > at failover. > > Signed-off-by: Yang Hongyang > CC: Ian Campbell > CC: Ian Jackson > CC: Wei Liu > CC: Andrew Cooper Tools Maintainers: I have not reviewed this in detail but I am happy with it. It is all just changes to the compat code which will disappear anyway when I get full libxl/migrationv2 working. ~Andrew > --- > tools/libxc/xc_sr_common.h | 5 +++++ > tools/libxc/xc_sr_restore.c | 12 ++++++++++++ > tools/libxc/xc_sr_restore_x86_hvm.c | 28 +++++++++++++++++++++++++--- > 3 files changed, 42 insertions(+), 3 deletions(-) > > diff --git a/tools/libxc/xc_sr_common.h b/tools/libxc/xc_sr_common.h > index 276d00a..0ba9728 100644 > --- a/tools/libxc/xc_sr_common.h > +++ b/tools/libxc/xc_sr_common.h > @@ -288,6 +288,11 @@ struct xc_sr_context > /* HVM context blob. */ > void *context; > size_t contextsz; > + > +#ifdef XG_LIBXL_HVM_COMPAT > + uint32_t qlen; > + void *qbuf; > +#endif > } restore; > }; > } x86_hvm; > diff --git a/tools/libxc/xc_sr_restore.c b/tools/libxc/xc_sr_restore.c > index 53bd674..8022c3d 100644 > --- a/tools/libxc/xc_sr_restore.c > +++ b/tools/libxc/xc_sr_restore.c > @@ -510,6 +510,9 @@ static int process_record(struct xc_sr_context *ctx, struct xc_sr_record *rec) > return rc; > } > > +#ifdef XG_LIBXL_HVM_COMPAT > +extern int read_qemu(struct xc_sr_context *ctx); > +#endif > /* > * Restore a domain. > */ > @@ -546,6 +549,15 @@ static int restore(struct xc_sr_context *ctx) > > } while ( rec.type != REC_TYPE_END ); > > +#ifdef XG_LIBXL_HVM_COMPAT > + if ( ctx->dominfo.hvm ) > + { > + rc = read_qemu(ctx); > + if ( rc ) > + goto err; > + } > +#endif > + > rc = ctx->restore.ops.stream_complete(ctx); > if ( rc ) > goto err; > diff --git a/tools/libxc/xc_sr_restore_x86_hvm.c b/tools/libxc/xc_sr_restore_x86_hvm.c > index 6e9b318..6f5af0e 100644 > --- a/tools/libxc/xc_sr_restore_x86_hvm.c > +++ b/tools/libxc/xc_sr_restore_x86_hvm.c > @@ -94,14 +94,14 @@ static int handle_hvm_params(struct xc_sr_context *ctx, > } > > #ifdef XG_LIBXL_HVM_COMPAT > -static int handle_qemu(struct xc_sr_context *ctx) > +int read_qemu(struct xc_sr_context *ctx); > +int read_qemu(struct xc_sr_context *ctx) > { > xc_interface *xch = ctx->xch; > - char qemusig[21], path[256]; > + char qemusig[21]; > uint32_t qlen; > void *qbuf = NULL; > int rc = -1; > - FILE *fp = NULL; > > if ( read_exact(ctx->fd, qemusig, sizeof(qemusig)) ) > { > @@ -137,6 +137,28 @@ static int handle_qemu(struct xc_sr_context *ctx) > goto out; > } > > + /* With Remus, this could be read many times */ > + if ( ctx->x86_hvm.restore.qbuf ) > + free(ctx->x86_hvm.restore.qbuf); > + ctx->x86_hvm.restore.qbuf = qbuf; > + ctx->x86_hvm.restore.qlen = qlen; > + rc = 0; > + > +out: > + if (rc) > + free(qbuf); > + return rc; > +} > + > +static int handle_qemu(struct xc_sr_context *ctx) > +{ > + xc_interface *xch = ctx->xch; > + char path[256]; > + uint32_t qlen = ctx->x86_hvm.restore.qlen; > + void *qbuf = ctx->x86_hvm.restore.qbuf; > + int rc = -1; > + FILE *fp = NULL; > + > sprintf(path, XC_DEVICE_MODEL_RESTORE_FILE".%u", ctx->domid); > fp = fopen(path, "wb"); > if ( !fp )