[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH][RESEND] make xm reboot work for vmx domain
# 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) Attachment:
reboot4.patch _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |