From 33098e7fc421bc77dba7506366a627abe700aab0 Mon Sep 17 00:00:00 2001 From: Ke Yu Date: Tue, 24 Jan 2006 17:58:43 +0100 Subject: [PATCH] This patch make xm reboot/shutdown work for vmx doamin. xm reboot fails 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 fix 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 --- tools/python/xen/xend/image.py | 39 +++++++++++++++++++++++++++ tools/python/xen/xend/server/blkif.py | 12 +++++---- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index e50c2b4c3c..338a1006eb 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -25,6 +25,7 @@ from xen.xend import sxp 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() @@ -229,6 +230,8 @@ class VmxImageHandler(ImageHandler): 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, control_evtchn = self.device_channel, @@ -365,6 +368,7 @@ class VmxImageHandler(ImageHandler): return vncconnect def destroy(self): + self.unregister_shutdown_watch(); import signal if not self.pid: return @@ -398,6 +402,41 @@ class VmxImageHandler(ImageHandler): 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 --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index 23135aa08b..02cd4f26f7 100644 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -42,10 +42,6 @@ class BlkifController(DevController): """@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 @@ class BlkifController(DevController): '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) -- 2.30.2