[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 14/14] libxc/restore: split read/handle qemu info
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 <yanghy@xxxxxxxxxxxxxx> CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> CC: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- 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 ) -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |