# HG changeset patch
# User Yu Ke <ke.yu@xxxxxxxxx>
# Node ID 21bcf6e59fafb61e32521f54ff3890367cfc7e4d
# Parent 8d6edcf06f9b21cd7db68bdeb40c13ac3de60c12
This patch makes xm reboot/shutdown work for vmx doamin.
xm reboot failed due to two issues:
1. no mechanism to change XendDomainInfo.info to trigger domain reboot
2. ioemu blkif parameter is missing during reboot, thus device model
recreation will fail.
This patch fixes these issues by
1. introducing a xswatch to monitor the control/shutdown node. once
fired, it will change the XendDomainInfo.info to trigger domain reboot
2. saving the ioemu blkif parameter in xen store just like DomU does.
Signed-off-by: Yu Ke <ke.yu@xxxxxxxxx>
diff -r 8d6edcf06f9b -r 21bcf6e59faf tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Tue Jan 17 16:09:03 2006 +0100
+++ b/tools/python/xen/xend/image.py Wed Jan 18 15:52:12 2006 +0800
@@ -25,6 +25,7 @@
from xen.xend.XendError import VmError
from xen.xend.XendLogging import log
from xen.xend.server.netif import randomMAC
+from xen.xend.xenstore.xswatch import xswatch
xc = xen.lowlevel.xc.xc()
@@ -228,6 +229,8 @@
log.debug("vcpus = %d", self.vm.getVCpuCount())
log.debug("acpi = %d", self.acpi)
log.debug("apic = %d", self.apic)
+
+ self.register_shutdown_watch()
return xc.vmx_build(dom = self.vm.getDomid(),
image = self.kernel,
@@ -365,6 +368,7 @@
return vncconnect
def destroy(self):
+ self.unregister_shutdown_watch();
import signal
if not self.pid:
return
@@ -398,6 +402,41 @@
else:
return 1 + ((mem_mb + 3) >> 2)
+ def register_shutdown_watch(self):
+ """ add xen store watch on control/shutdown """
+ self.shutdownWatch = xswatch(self.vm.dompath +
"/control/shutdown", \
+ self.vmx_shutdown)
+ log.debug("vmx shutdown watch registered")
+
+ def unregister_shutdown_watch(self):
+ """Remove the watch on the control/shutdown, if any. Nothrow
+ guarantee."""
+
+ try:
+ if self.shutdownWatch:
+ self.shutdownWatch.unwatch()
+ except:
+ log.exception("Unwatching vmx shutdown watch failed.")
+ self.shutdownWatch = None
+ log.debug("vmx shutdown watch unregistered")
+
+ def vmx_shutdown(self, _):
+ """ watch call back on node control/shutdown,
+ if node changed, this function will be called
+ """
+ from xen.xend.XendDomainInfo import shutdown_reasons
+ xd = xen.xend.XendDomain.instance()
+ vm = xd.domain_lookup( self.vm.getDomid() )
+
+ reason = vm.readDom('control/shutdown')
+ log.debug("vmx_shutdown fired, shutdown reason=%s", reason)
+ for x in shutdown_reasons.keys():
+ if shutdown_reasons[x] == reason:
+ vm.info['shutdown'] = 1
+ vm.info['shutdown_reason'] = x
+ vm.refreshShutdown(vm.info)
+
+ return 1 # Keep watching
"""Table of image handler classes for virtual machine images. Indexed
by
image type.
diff -r 8d6edcf06f9b -r 21bcf6e59faf
tools/python/xen/xend/server/blkif.py
--- a/tools/python/xen/xend/server/blkif.py Tue Jan 17 16:09:03 2006
+0100
+++ b/tools/python/xen/xend/server/blkif.py Wed Jan 18 15:52:12 2006
+0800
@@ -42,10 +42,6 @@
"""@see DevController.getDeviceDetails"""
dev = sxp.child_value(config, 'dev')
- if 'ioemu:' in dev:
- return (None,{},{})
-
- devid = blkif.blkdev_name_to_number(dev)
(typ, params) = string.split(sxp.child_value(config, 'uname'),
':', 1)
back = { 'dev' : dev,
@@ -54,7 +50,13 @@
'mode' : sxp.child_value(config, 'mode', 'r')
}
- front = { 'virtual-device' : "%i" % devid }
+ if 'ioemu:' in dev:
+ (dummy, dev1) = string.split(dev, ':', 1)
+ devid = blkif.blkdev_name_to_number(dev1)
+ front = {}
+ else:
+ devid = blkif.blkdev_name_to_number(dev)
+ front = { 'virtual-device' : "%i" % devid }
return (devid, back, front)
reboot4.patch
Description: reboot4.patch
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|