From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hongyang Yang Subject: Re: [PATCH Remus v1 4/8] tools/libxc: split read/handle qemu info Date: Thu, 7 May 2015 21:55:22 +0800 Message-ID: <554B6ECA.4070001@cn.fujitsu.com> References: <1430980646-316-1-git-send-email-yanghy@cn.fujitsu.com> <1430980646-316-5-git-send-email-yanghy@cn.fujitsu.com> <554B4300.1070109@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <554B4300.1070109@citrix.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: Andrew Cooper , xen-devel@lists.xen.org Cc: wei.liu2@citrix.com, ian.campbell@citrix.com, wency@cn.fujitsu.com, eddie.dong@intel.com, yunhong.jiang@intel.com, ian.jackson@eu.citrix.com, rshriram@cs.ubc.ca List-Id: xen-devel@lists.xenproject.org On 05/07/2015 06:48 PM, Andrew Cooper wrote: > On 07/05/15 07:37, 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 > > I presume this is because Remus sends multiple qemu records in the stream? > > I will be fixing the qemu record layer violation as part of libxl > migration v2, at which point all the XG_LIBXL_HVM_COMPAT code shall > disappear. ye, this patch should disappear with your fix :) > > As all this code appears to live inside XG_LIBXL_HVM_COMPAT, I am > willing to trust that it DoesTheRightThing, if you have confirmed that > plain HVM migration with migration v2 and XG_LIBXL_HVM_COMPAT continues > to work (I am slightly suspicious of the 3rd hunk in this regard). I tested both pv&hvm, normal migration are all work as it is. > > ~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 ef42412..6f099b8 100644 >> --- a/tools/libxc/xc_sr_common.h >> +++ b/tools/libxc/xc_sr_common.h >> @@ -279,6 +279,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 ) > > . > -- Thanks, Yang.