# HG changeset patch
# User shand@xxxxxxxxxxxxxxxxxxxxxxxxxxx
# Node ID a1de77c1486c5f35884e9f578b7f33b6bd75c362
# Parent 0c0d929e787c0848ba26168cd0fbebb6dad2aaf2
Enable 'live' migration from a tools pov; prior to this the 'live' flag was
being ignored by xend/xc_linux_save.
Signed-off-by: Steven Hand <steven@xxxxxxxxxxxxx>
diff -r 0c0d929e787c -r a1de77c1486c tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c Fri Sep 2 17:55:24 2005
+++ b/tools/libxc/xc_linux_save.c Sat Sep 3 01:36:29 2005
@@ -20,6 +20,24 @@
#define BATCH_SIZE 1024 /* 1024 pages (4MB) at a time */
#define MAX_MBIT_RATE 500
+
+
+/*
+** Default values for important tuning parameters. Can override by passing
+** non-zero replacement values to xc_linux_save().
+**
+** XXX SMH: should consider if want to be able to override MAX_MBIT_RATE too.
+**
+*/
+#define DEF_MAX_ITERS 29 /* limit us to 30 times round loop */
+#define DEF_MAX_FACTOR 3 /* never send more than 3x nr_pfns */
+
+
+
+/* Flags to control behaviour of xc_linux_save */
+#define XCFLAGS_LIVE 1
+#define XCFLAGS_DEBUG 2
+
#define DEBUG 0
@@ -320,18 +338,18 @@
xc_dominfo_t *info,
vcpu_guest_context_t *ctxt)
{
- int i=0;
+ int i = 0;
char ans[30];
printf("suspend\n");
fflush(stdout);
if (fgets(ans, sizeof(ans), stdin) == NULL) {
- ERR("failed reading suspend reply");
- return -1;
+ ERR("failed reading suspend reply");
+ return -1;
}
if (strncmp(ans, "done\n", 5)) {
- ERR("suspend reply incorrect: %s", ans);
- return -1;
+ ERR("suspend reply incorrect: %s", ans);
+ return -1;
}
retry:
@@ -377,19 +395,16 @@
return -1;
}
-int xc_linux_save(int xc_handle, int io_fd, u32 dom)
+int xc_linux_save(int xc_handle, int io_fd, u32 dom, u32 max_iters,
+ u32 max_factor, u32 flags)
{
xc_dominfo_t info;
int rc = 1, i, j, k, last_iter, iter = 0;
unsigned long mfn;
- int live = 0; // (ioctxt->flags & XCFLAGS_LIVE);
- int debug = 0; // (ioctxt->flags & XCFLAGS_DEBUG);
+ int live = (flags & XCFLAGS_LIVE);
+ int debug = (flags & XCFLAGS_DEBUG);
int sent_last_iter, skip_this_iter;
-
- /* Important tuning parameters */
- int max_iters = 29; /* limit us to 30 times round loop */
- int max_factor = 3; /* never send more than 3x nr_pfns */
/* The new domain's shared-info frame number. */
unsigned long shared_info_frame;
@@ -442,8 +457,16 @@
MBIT_RATE = START_MBIT_RATE;
- DPRINTF("xc_linux_save start %d\n", dom);
-
+
+ /* If no explicit control parameters given, use defaults */
+ if(!max_iters)
+ max_iters = DEF_MAX_ITERS;
+ if(!max_factor)
+ max_factor = DEF_MAX_FACTOR;
+
+
+ DPRINTF("xc_linux_save start DOM%u live=%s\n", dom, live?"true":"false");
+
if (mlock(&ctxt, sizeof(ctxt))) {
ERR("Unable to mlock ctxt");
return 1;
diff -r 0c0d929e787c -r a1de77c1486c tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h Fri Sep 2 17:55:24 2005
+++ b/tools/libxc/xenguest.h Sat Sep 3 01:36:29 2005
@@ -6,13 +6,12 @@
* Copyright (c) 2003-2004, K A Fraser.
*/
-#ifndef XENBUILD_H
-#define XENBUILD_H
+#ifndef XENGUEST_H
+#define XENGUEST_H
-#define XCFLAGS_VERBOSE 1
-#define XCFLAGS_LIVE 2
-#define XCFLAGS_DEBUG 4
-#define XCFLAGS_CONFIGURE 8
+#define XCFLAGS_LIVE 1
+#define XCFLAGS_DEBUG 2
+
/**
* This function will save a domain running Linux.
@@ -22,7 +21,8 @@
* @parm dom the id of the domain
* @return 0 on success, -1 on failure
*/
-int xc_linux_save(int xc_handle, int fd, uint32_t dom);
+int xc_linux_save(int xc_handle, int fd, uint32_t dom, uint32_t max_iters,
+ uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */);
/**
* This function will restore a saved domain running Linux.
@@ -35,8 +35,9 @@
* @parm store_mfn returned with the mfn of the store page
* @return 0 on success, -1 on failure
*/
-int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom, unsigned long
nr_pfns,
- unsigned int store_evtchn, unsigned long *store_mfn);
+int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom,
+ unsigned long nr_pfns, unsigned int store_evtchn,
+ unsigned long *store_mfn);
int xc_linux_build(int xc_handle,
uint32_t domid,
@@ -65,4 +66,4 @@
unsigned int store_evtchn,
unsigned long *store_mfn);
-#endif
+#endif // XENGUEST_H
diff -r 0c0d929e787c -r a1de77c1486c tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py Fri Sep 2 17:55:24 2005
+++ b/tools/python/xen/xend/XendCheckpoint.py Sat Sep 3 01:36:29 2005
@@ -34,7 +34,7 @@
raise XendError(errmsg)
return buf
-def save(xd, fd, dominfo):
+def save(xd, fd, dominfo, live):
write_exact(fd, SIGNATURE, "could not write guest state file: signature")
config = sxp.to_string(dominfo.sxpr())
@@ -42,8 +42,13 @@
"could not write guest state file: config len")
write_exact(fd, config, "could not write guest state file: config")
+ # xc_save takes three customization parameters: maxit, max_f, and flags
+ # the last controls whether or not save is 'live', while the first two
+ # further customize behaviour when 'live' save is enabled. Passing "0"
+ # simply uses the defaults compiled into libxenguest; see the comments
+ # and/or code in xc_linux_save() for more information.
cmd = [PATH_XC_SAVE, str(xc.handle()), str(fd),
- str(dominfo.id)]
+ str(dominfo.id), "0", "0", str(live) ]
log.info("[xc_save] " + join(cmd))
child = xPopen3(cmd, True, -1, [fd, xc.handle()])
diff -r 0c0d929e787c -r a1de77c1486c tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py Fri Sep 2 17:55:24 2005
+++ b/tools/python/xen/xend/XendDomain.py Sat Sep 3 01:36:29 2005
@@ -542,7 +542,7 @@
dominfo.name = "tmp-" + dominfo.name
try:
- XendCheckpoint.save(self, sock.fileno(), dominfo)
+ XendCheckpoint.save(self, sock.fileno(), dominfo, live)
except:
if dst == "localhost":
dominfo.name = string.replace(dominfo.name, "tmp-", "", 1)
@@ -563,7 +563,8 @@
fd = os.open(dst, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
- return XendCheckpoint.save(self, fd, dominfo)
+ # For now we don't support 'live checkpoint'
+ return XendCheckpoint.save(self, fd, dominfo, False)
except OSError, ex:
raise XendError("can't write guest state file %s: %s" %
diff -r 0c0d929e787c -r a1de77c1486c tools/xcutils/xc_save.c
--- a/tools/xcutils/xc_save.c Fri Sep 2 17:55:24 2005
+++ b/tools/xcutils/xc_save.c Sat Sep 3 01:36:29 2005
@@ -17,14 +17,17 @@
int
main(int argc, char **argv)
{
- unsigned int xc_fd, io_fd, domid;
+ unsigned int xc_fd, io_fd, domid, maxit, max_f, flags;
- if (argc != 4)
- errx(1, "usage: %s xcfd iofd domid", argv[0]);
+ if (argc != 7)
+ errx(1, "usage: %s xcfd iofd domid maxit maxf flags", argv[0]);
xc_fd = atoi(argv[1]);
io_fd = atoi(argv[2]);
domid = atoi(argv[3]);
+ maxit = atoi(argv[4]);
+ max_f = atoi(argv[5]);
+ flags = atoi(argv[6]);
- return xc_linux_save(xc_fd, io_fd, domid);
+ return xc_linux_save(xc_fd, io_fd, domid, maxit, max_f, flags);
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|