This patch implements python code for supporting Kemari. It provides --kemari
option and notifies it to the destination. If --kemari is specified,
xc_kemari_save is called instead of xc_save on the sender, and
xc_kemari_restore is called instead of xc_restore on the receiver.
Signed-off-by: Yoshisato Yanagisawa <yanagisawa.yoshisato@xxxxxxxxxxxxx>
Signed-off-by: Yoshi Tamura <tamura.yoshiaki@xxxxxxxxxxxxx>
---
tools/python/xen/xend/XendAPI.py | 3 -
tools/python/xen/xend/XendCheckpoint.py | 81 ++++++++++++++++++++++++++++----
tools/python/xen/xend/XendDomain.py | 6 +-
tools/python/xen/xm/migrate.py | 10 +++
4 files changed, 85 insertions(+), 15 deletions(-)
diff -r 19201eebab16 tools/python/xen/xend/XendAPI.py
--- a/tools/python/xen/xend/XendAPI.py Thu Sep 25 13:33:50 2008 +0100
+++ b/tools/python/xen/xend/XendAPI.py Wed Mar 04 17:04:23 2009 +0900
@@ -1780,9 +1780,10 @@
port = other_config.get("port", 0)
node = other_config.get("node", -1)
ssl = other_config.get("ssl", None)
+ kemari = other_config.get("kemari", None)
xendom.domain_migrate(xeninfo.getDomid(), destination_url,
- bool(live), port, node, ssl)
+ bool(live), port, node, ssl, kemari)
return xen_api_success_void()
def VM_save(self, _, vm_ref, dest, checkpoint):
diff -r 19201eebab16 tools/python/xen/xend/XendCheckpoint.py
--- a/tools/python/xen/xend/XendCheckpoint.py Thu Sep 25 13:33:50 2008 +0100
+++ b/tools/python/xen/xend/XendCheckpoint.py Wed Mar 04 17:04:23 2009 +0900
@@ -28,7 +28,9 @@
QEMU_SIGNATURE = "QemuDeviceModelRecord"
dm_batch = 512
XC_SAVE = "xc_save"
+XC_KEMARI_SAVE = "xc_kemari_save"
XC_RESTORE = "xc_restore"
+XC_KEMARI_RESTORE = "xc_kemari_restore"
sizeof_int = calcsize("i")
@@ -64,11 +66,38 @@
list.insert (i+1, value)
return
+def get_dev_info(info, n):
+ i = 0
+ while i < len(info):
+ if (info[i][0] == n):
+ return [n, info[i][1]]
+ i = i + 1
+ return [n, '']
-def save(fd, dominfo, network, live, dst, checkpoint=False, node=-1):
+def save(fd, dominfo, network, live, dst, checkpoint=False, node=-1,
kemari=False):
write_exact(fd, SIGNATURE, "could not write guest state file: signature")
sxprep = dominfo.sxpr()
+
+ # Add kemari option if enabled.
+ if kemari:
+ sxprep.append(['kemari', kemari])
+ pv_devlist = []
+ pv_devs = dominfo.getDeviceSxprs('vbd')
+ for x in pv_devs:
+ devinfo = []
+ for n in ['event-channel', 'ring-ref']:
+ devinfo.append(get_dev_info(x[1], n))
+ pv_devlist.append([x[0], devinfo])
+ pv_devs = dominfo.getDeviceSxprs('vif')
+ for x in pv_devs:
+ devinfo = []
+ for n in ['event-channel', 'tx-ring-ref', 'rx-ring-ref',
+ 'request-rx-copy', 'feature-rx-notify', 'feature-sg',
+ 'feature-gso-tcpv4']:
+ devinfo.append(get_dev_info(x[1], n))
+ pv_devlist.append([x[0], devinfo])
+ sxprep.append(['kemari-device-info', pv_devlist])
if node > -1:
insert_after(sxprep,'vcpus',['node', str(node)])
@@ -97,7 +126,16 @@
# enabled. Passing "0" simply uses the defaults compiled into
# libxenguest; see the comments and/or code in xc_linux_save() for
# more information.
- cmd = [xen.util.auxbin.pathTo(XC_SAVE), str(fd),
+ if kemari:
+ if not hvm:
+ raise XendError("You can only use kemari on HVM domain")
+
+ cmd = [xen.util.auxbin.pathTo(XC_KEMARI_SAVE), str(fd),
+ str(dominfo.getDomid()), "0", "0",
+ str(int(live) | (int(hvm) << 2)) ]
+ log.debug("[xc_save]: %s", string.join(cmd))
+ else:
+ cmd = [xen.util.auxbin.pathTo(XC_SAVE), str(fd),
str(dominfo.getDomid()), "0", "0",
str(int(live) | (int(hvm) << 2)) ]
log.debug("[xc_save]: %s", string.join(cmd))
@@ -125,7 +163,7 @@
forkHelper(cmd, fd, saveInputHandler, False)
# put qemu device model state
- if os.path.exists("/var/lib/xen/qemu-save.%d" % dominfo.getDomid()):
+ if not kemari and os.path.exists("/var/lib/xen/qemu-save.%d" %
dominfo.getDomid()):
write_exact(fd, QEMU_SIGNATURE, "could not write qemu signature")
qemu_fd = os.open("/var/lib/xen/qemu-save.%d" % dominfo.getDomid(),
os.O_RDONLY)
@@ -138,7 +176,7 @@
os.close(qemu_fd)
os.remove("/var/lib/xen/qemu-save.%d" % dominfo.getDomid())
- if checkpoint:
+ if checkpoint or kemari:
dominfo.resumeDomain()
else:
dominfo.destroy()
@@ -184,6 +222,16 @@
raise XendError("not a valid guest state file: config parse")
vmconfig = p.get_val()
+
+ # Checks kemari is enabled or not.
+ # Since Xen do not know kemari option, this option will not be migrated.
+ is_kemari = False
+ kemari_device_info = []
+ for v in vmconfig:
+ if v[0] == 'kemari' and v[1]:
+ is_kemari = True
+ if v[0] == 'kemari-device-info' and v[1]:
+ kemari_device_info = v[1]
if not relocating:
domconfig = XendConfig(sxp_obj = vmconfig)
@@ -258,7 +306,15 @@
shadow_cur = xc.shadow_mem_control(dominfo.getDomid(), shadow / 1024)
dominfo.info['shadow_memory'] = shadow_cur
- cmd = map(str, [xen.util.auxbin.pathTo(XC_RESTORE),
+ # Use Kemari restore. Switching mechanism between normal migration
+ # and Kemari migration will be implemented lator.
+ #
+ if is_kemari:
+ cmd = map(str, [xen.util.auxbin.pathTo(XC_KEMARI_RESTORE),
+ fd, dominfo.getDomid(),
+ store_port, console_port, int(is_hvm), pae, apic])
+ else:
+ cmd = map(str, [xen.util.auxbin.pathTo(XC_RESTORE),
fd, dominfo.getDomid(),
store_port, console_port, int(is_hvm), pae, apic])
log.debug("[xc_restore]: %s", string.join(cmd))
@@ -266,6 +322,8 @@
handler = RestoreInputHandler()
forkHelper(cmd, fd, handler.handler, True)
+ if is_kemari:
+ os.close(fd)
# We don't want to pass this fd to any other children -- we
# might need to recover the disk space that backs it.
@@ -285,7 +343,7 @@
# get qemu state and create a tmp file for dm restore
# Even PV guests may have QEMU stat, but its not currently
# used so only bother with HVM currently.
- if is_hvm:
+ if is_hvm and not is_kemari:
qemu_signature = read_exact(fd, len(QEMU_SIGNATURE),
"invalid device model signature read")
if qemu_signature != QEMU_SIGNATURE:
@@ -303,8 +361,10 @@
os.close(qemu_fd)
restore_image.setCpuid()
-
- os.read(fd, 1) # Wait for source to close connection
+ if is_kemari:
+ restore_image.setCpuid()
+ else:
+ os.read(fd, 1) # Wait for source to close connection
dominfo.completeRestore(handler.store_mfn, handler.console_mfn)
@@ -322,7 +382,10 @@
lock = False;
try:
- dominfo.waitForDevices() # Wait for backends to set up
+ if is_kemari:
+ dominfo.waitForAttachedDevices(kemari_device_info)
+ else:
+ dominfo.waitForDevices() # Wait for backends to set up
except Exception, exn:
log.exception(exn)
diff -r 19201eebab16 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py Thu Sep 25 13:33:50 2008 +0100
+++ b/tools/python/xen/xend/XendDomain.py Wed Mar 04 17:04:23 2009 +0900
@@ -1267,7 +1267,7 @@
return val
- def domain_migrate(self, domid, dst, live=False, port=0, node=-1,
ssl=None):
+ def domain_migrate(self, domid, dst, live=False, port=0, node=-1, ssl=None,
kemari=None):
"""Start domain migration.
@param domid: Domain ID or Name
@@ -1332,7 +1332,7 @@
try:
XendCheckpoint.save(p2cwrite, dominfo, True, live, dst,
- node=node)
+ node=node, kemari=kemari)
finally:
sock.shutdown()
sock.close()
@@ -1358,7 +1358,7 @@
try:
XendCheckpoint.save(sock.fileno(), dominfo, True, live,
- dst, node=node)
+ dst, node=node, kemari=kemari)
finally:
sock.close()
diff -r 19201eebab16 tools/python/xen/xm/migrate.py
--- a/tools/python/xen/xm/migrate.py Thu Sep 25 13:33:50 2008 +0100
+++ b/tools/python/xen/xm/migrate.py Wed Mar 04 17:04:25 2009 +0900
@@ -51,6 +51,10 @@
fn=set_true, default=None,
use="Use ssl connection for migration.")
+gopts.opt('kemari', short='k',
+ fn=set_true, default=None,
+ use="Use kemari migration.")
+
def help():
return str(gopts)
@@ -70,7 +74,8 @@
other_config = {
"port": opts.vals.port,
"node": opts.vals.node,
- "ssl": opts.vals.ssl
+ "ssl": opts.vals.ssl,
+ "kemari": opts.vals.kemari
}
server.xenapi.VM.migrate(vm_ref, dst, bool(opts.vals.live),
other_config)
@@ -78,4 +83,5 @@
server.xend.domain.migrate(dom, dst, opts.vals.live,
opts.vals.port,
opts.vals.node,
- opts.vals.ssl)
+ opts.vals.ssl,
+ opts.vals.kemari)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|