Hi Ewan, Would you please have a look on this patch? All the change is only related to vmx domain. I have tested DomU and vmx domain reboot, both work. - Ke # HG changeset patch # User Yu Ke <ke.yu@intel.com> # 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@intel.com> 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) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel