mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
tools/migrate: Fix regression when migrating from older version of Xen
Commit00a4b65f85Sep 7 2010 "libxc: provide notification of final checkpoint to restore end" broke migration from any version of Xen using tools from prior to that commit Older tools have no idea about an XC_SAVE_ID_LAST_CHECKPOINT, causing newer tools xc_domain_restore() to start reading the qemu save record, as ctx->last_checkpoint is 0. The failure looks like: xc: error: Max batch size exceeded (1970103633). Giving up. where 1970103633 = 0x756d6551 = *(uint32_t*)"Qemu" With this fix in place, the behaviour for normal migrations is reverted to how it was before the regression; the migration is considered non-checkpointed right from the start. A XC_SAVE_ID_LAST_CHECKPOINT chunk seen in the migration stream is a nop. For checkpointed migrations the behaviour is unchanged. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Ian Campbell <Ian.Campbell@citrix.com> CC: Ian Jackson <Ian.Jackson@eu.citrix.com> Acked-by: Shriram Rajagopalan <rshriram@cs.ubc.ca> (Remus bits) master commit:7051d5c872master date: Thu, 10 Oct 2013 11:28:21 +0000 Backport to Xen-4.3: As remus was not a supported feature in libxl in 4.3 and earlier, this backport hardcodes a non-checkpointed stream from libxl, removing the need to any playing around with the IDL and API. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
This commit is contained in:
1 parent
a002c8491b
commit
be2f2316f1
6 files changed
+16
-10
No files matched your search
@@ -1401,7 +1401,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
|
||||
domid_t store_domid, unsigned int console_evtchn,
|
||||
unsigned long *console_mfn, domid_t console_domid,
|
||||
unsigned int hvm, unsigned int pae, int superpages,
|
||||
int no_incr_generationid,
|
||||
int no_incr_generationid, int checkpointed_stream,
|
||||
unsigned long *vm_generationid_addr,
|
||||
struct restore_callbacks *callbacks)
|
||||
{
|
||||
@@ -1472,6 +1472,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
|
||||
|
||||
ctx->superpages = superpages;
|
||||
ctx->hvm = hvm;
|
||||
ctx->last_checkpoint = !checkpointed_stream;
|
||||
|
||||
ctxt = xc_hypercall_buffer_alloc(xch, ctxt, sizeof(*ctxt));
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
|
||||
domid_t store_domid, unsigned int console_evtchn,
|
||||
unsigned long *console_mfn, domid_t console_domid,
|
||||
unsigned int hvm, unsigned int pae, int superpages,
|
||||
int no_incr_generationid,
|
||||
int no_incr_generationid, int checkpointed_stream,
|
||||
unsigned long *vm_generationid_addr,
|
||||
struct restore_callbacks *callbacks)
|
||||
{
|
||||
|
||||
@@ -114,6 +114,7 @@ struct restore_callbacks {
|
||||
* @parm pae non-zero if this HVM domain has PAE support enabled
|
||||
* @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 checkpointed_stream non-zero if the far end of the stream is using checkpointing
|
||||
* @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
|
||||
@@ -124,7 +125,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
|
||||
domid_t store_domid, unsigned int console_evtchn,
|
||||
unsigned long *console_mfn, domid_t console_domid,
|
||||
unsigned int hvm, unsigned int pae, int superpages,
|
||||
int no_incr_generationid,
|
||||
int no_incr_generationid, int checkpointed_stream,
|
||||
unsigned long *vm_generationid_addr,
|
||||
struct restore_callbacks *callbacks);
|
||||
/**
|
||||
|
||||
@@ -264,7 +264,7 @@ int main(int argc, char **argv)
|
||||
r = xc_domain_restore(xch, io_fd, dom, store_evtchn, &store_mfn,
|
||||
store_domid, console_evtchn, &console_mfn,
|
||||
console_domid, hvm, pae, superpages,
|
||||
no_incr_genidad, &genidad,
|
||||
no_incr_genidad, 0, &genidad,
|
||||
&helper_restore_callbacks);
|
||||
helper_stub_restore_results(store_mfn,console_mfn,genidad,0);
|
||||
complete(r);
|
||||
|
||||
@@ -301,7 +301,7 @@ def restore(xd, fd, dominfo = None, paused = False, relocating = False):
|
||||
|
||||
cmd = map(str, [xen.util.auxbin.pathTo(XC_RESTORE),
|
||||
fd, dominfo.getDomid(),
|
||||
store_port, console_port, int(is_hvm), pae, apic, superpages])
|
||||
store_port, console_port, int(is_hvm), pae, apic, superpages, 1])
|
||||
log.debug("[xc_restore]: %s", string.join(cmd))
|
||||
|
||||
handler = RestoreInputHandler()
|
||||
|
||||
@@ -19,7 +19,7 @@ int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
unsigned int domid, store_evtchn, console_evtchn;
|
||||
unsigned int hvm, pae, apic, lflags;
|
||||
unsigned int hvm, pae, apic, lflags, checkpointed;
|
||||
xc_interface *xch;
|
||||
int io_fd, ret;
|
||||
int superpages;
|
||||
@@ -27,9 +27,9 @@ main(int argc, char **argv)
|
||||
xentoollog_level lvl;
|
||||
xentoollog_logger *l;
|
||||
|
||||
if ( (argc != 8) && (argc != 9) )
|
||||
if ( !( argc >= 8 && argc <= 10) )
|
||||
errx(1, "usage: %s iofd domid store_evtchn "
|
||||
"console_evtchn hvm pae apic [superpages]", argv[0]);
|
||||
"console_evtchn hvm pae apic [superpages [checkpointed]]", argv[0]);
|
||||
|
||||
lvl = XTL_DETAIL;
|
||||
lflags = XTL_STDIOSTREAM_SHOW_PID | XTL_STDIOSTREAM_HIDE_PROGRESS;
|
||||
@@ -45,14 +45,18 @@ main(int argc, char **argv)
|
||||
hvm = atoi(argv[5]);
|
||||
pae = atoi(argv[6]);
|
||||
apic = atoi(argv[7]);
|
||||
if ( argc == 9 )
|
||||
if ( argc >= 9 )
|
||||
superpages = atoi(argv[8]);
|
||||
else
|
||||
superpages = !!hvm;
|
||||
if ( argc >= 10 )
|
||||
checkpointed = atoi(argv[9]);
|
||||
else
|
||||
checkpointed = 0;
|
||||
|
||||
ret = xc_domain_restore(xch, io_fd, domid, store_evtchn, &store_mfn, 0,
|
||||
console_evtchn, &console_mfn, 0, hvm, pae, superpages,
|
||||
0, NULL, NULL);
|
||||
0, checkpointed, NULL, NULL);
|
||||
|
||||
if ( ret == 0 )
|
||||
{
|
||||
|
||||