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 <ke.yu@intel.com>
This commit is contained in:
Ke Yu committed 2006-01-24 17:58:43 +01:00
1 parent 1c74b18b4d
commit 33098e7fc4
2 files changed
+46 -5

No files matched your search

+39
View File
@@ -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.
+7 -5
View File
@@ -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)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.