mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
bitkeeper revision 1.1010.1.6 (40dbffabQ7DNCZQhMx5yK0HaV4MMWQ)
Handle domain exit virq and destroy blkif, netif.
This commit is contained in:
1 parent
1cbe6bfc33
commit
2fda1279a8
6 files changed
+80
-13
No files matched your search
@@ -42,8 +42,13 @@ class XendDomain:
|
||||
if xroot.get_rebooted():
|
||||
print 'XendDomain> rebooted: removing all domain info'
|
||||
self.rm_all()
|
||||
eserver.subscribe('xend.virq', self.onVirq)
|
||||
self.initial_refresh()
|
||||
|
||||
def onVirq(self, event, val):
|
||||
print 'XendDomain> virq', val
|
||||
self.reap()
|
||||
|
||||
def rm_all(self):
|
||||
"""Remove all domain info. Used after reboot.
|
||||
"""
|
||||
@@ -136,13 +141,33 @@ class XendDomain:
|
||||
|
||||
def _delete_domain(self, id, notify=1):
|
||||
if id in self.domain:
|
||||
self.domain[id].died()
|
||||
if notify: eserver.inject('xend.domain.died', id)
|
||||
del self.domain[id]
|
||||
if id in self.domain_db:
|
||||
del self.domain_db[id]
|
||||
self.db.delete(id)
|
||||
|
||||
def reap(self):
|
||||
print 'reap>'
|
||||
domlist = xc.domain_getinfo()
|
||||
casualties = []
|
||||
for d in domlist:
|
||||
print 'dom', d
|
||||
dead = 0
|
||||
dead = dead or (d['crashed'] or d['shutdown'])
|
||||
dead = dead or (d['dying'] and
|
||||
not(d['running'] or d['paused'] or d['blocked']))
|
||||
if dead:
|
||||
casualties.append(d)
|
||||
for d in casualties:
|
||||
id = str(d['dom'])
|
||||
print 'died> id=', id, d
|
||||
dominfo = self.domain.get(id)
|
||||
if not dominfo: continue
|
||||
dominfo.died()
|
||||
self.domain_destroy(id, refresh=0)
|
||||
print 'reap<'
|
||||
|
||||
def refresh(self):
|
||||
"""Refresh domain list from Xen.
|
||||
"""
|
||||
@@ -169,6 +194,7 @@ class XendDomain:
|
||||
d.update(dominfo)
|
||||
else:
|
||||
self._delete_domain(d.id)
|
||||
self.reap()
|
||||
|
||||
def refresh_domain(self, id):
|
||||
dom = int(id)
|
||||
@@ -232,7 +258,7 @@ class XendDomain:
|
||||
self.refresh()
|
||||
return val
|
||||
|
||||
def domain_destroy(self, id):
|
||||
def domain_destroy(self, id, refresh=1):
|
||||
"""Terminate domain immediately.
|
||||
"""
|
||||
dom = int(id)
|
||||
@@ -240,7 +266,7 @@ class XendDomain:
|
||||
return 0
|
||||
eserver.inject('xend.domain.destroy', id)
|
||||
val = xc.domain_destroy(dom=dom)
|
||||
self.refresh()
|
||||
if refresh: self.refresh()
|
||||
return val
|
||||
|
||||
def domain_migrate(self, id, dst):
|
||||
|
||||
@@ -415,6 +415,7 @@ class VirqClient:
|
||||
|
||||
def virqReceived(self, virq):
|
||||
print 'VirqClient.virqReceived>', virq
|
||||
eserver.inject('xend.virq', virq)
|
||||
|
||||
def lostChannel(self, channel):
|
||||
print 'VirqClient.lostChannel>', channel
|
||||
|
||||
@@ -40,14 +40,14 @@ class SrvDomain(SrvDir):
|
||||
def op_save(self, op, req):
|
||||
fn = FormFn(self.xd.domain_save,
|
||||
[['dom', 'int'],
|
||||
['dst', 'str']])
|
||||
['file', 'str']])
|
||||
val = fn(req.args, {'dom': self.dom.id})
|
||||
return val
|
||||
|
||||
def op_restore(self, op, req):
|
||||
fn = FormFn(self.xd.domain_restore,
|
||||
[['dom', 'int'],
|
||||
['src', 'str']])
|
||||
['file', 'str']])
|
||||
val = fn(req.args, {'dom': self.dom.id})
|
||||
return val
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
from twisted.internet import defer
|
||||
|
||||
from xenmgr import sxp
|
||||
from xenmgr import PrettyPrint
|
||||
|
||||
import channel
|
||||
import controller
|
||||
from messages import *
|
||||
@@ -140,11 +143,12 @@ class BlkDev(controller.Dev):
|
||||
return 'w' not in self.mode
|
||||
|
||||
def sxpr(self):
|
||||
print 'BlkDev>sxpr>', vars(self)
|
||||
val = ['blkif', ['vdev', self.vdev], ['mode', self.mode] ]
|
||||
val = ['blkdev', ['vdev', self.vdev], ['mode', self.mode] ]
|
||||
return val
|
||||
|
||||
def destroy(self):
|
||||
print 'BlkDev>destroy>', self.vdev
|
||||
PrettyPrint.prettyprint(self.sxpr())
|
||||
self.controller.send_be_vbd_destroy(self.vdev)
|
||||
|
||||
class BlkifController(controller.Controller):
|
||||
@@ -166,9 +170,18 @@ class BlkifController(controller.Controller):
|
||||
self.recv_fe_interface_connect,
|
||||
}
|
||||
self.attached = 1
|
||||
self.evtchn = None
|
||||
self.registerChannel()
|
||||
#print 'BlkifController<', 'dom=', self.dom, 'idx=', self.idx
|
||||
|
||||
def sxpr(self):
|
||||
val = ['blkif', ['dom', self.dom]]
|
||||
if self.evtchn:
|
||||
val.append(['evtchn',
|
||||
self.evtchn['port1'],
|
||||
self.evtchn['port2']])
|
||||
return val
|
||||
|
||||
def lostChannel(self):
|
||||
print 'BlkifController>lostChannel>', 'dom=', self.dom
|
||||
#self.destroyDevices()
|
||||
@@ -201,7 +214,9 @@ class BlkifController(controller.Controller):
|
||||
return d
|
||||
|
||||
def destroy(self):
|
||||
print 'BlkifController>destroy> dom=', self.dom
|
||||
self.destroyDevices()
|
||||
self.send_be_destroy()
|
||||
|
||||
def destroyDevices(self):
|
||||
for dev in self.getDevices():
|
||||
@@ -229,7 +244,8 @@ class BlkifController(controller.Controller):
|
||||
return self.attached
|
||||
|
||||
def reattached(self):
|
||||
"""All devices have been reattached after the back-end control domain has changed.
|
||||
"""All devices have been reattached after the back-end control
|
||||
domain has changed.
|
||||
"""
|
||||
msg = packMsg('blkif_fe_interface_status_changed_t',
|
||||
{ 'handle' : 0,
|
||||
@@ -246,6 +262,8 @@ class BlkifController(controller.Controller):
|
||||
def recv_fe_interface_connect(self, msg, req):
|
||||
val = unpackMsg('blkif_fe_interface_connect_t', msg)
|
||||
self.evtchn = channel.eventChannel(0, self.dom)
|
||||
print 'recv_fe_interface_connect>'
|
||||
PrettyPrint.prettyprint(self.sxpr())
|
||||
msg = packMsg('blkif_be_connect_t',
|
||||
{ 'domid' : self.dom,
|
||||
'blkif_handle' : val['handle'],
|
||||
@@ -272,6 +290,13 @@ class BlkifController(controller.Controller):
|
||||
'blkif_handle' : 0 })
|
||||
self.factory.writeRequest(msg)
|
||||
|
||||
def send_be_destroy(self):
|
||||
print '>BlkifController>send_be_destroy>', 'dom=', self.dom
|
||||
msg = packMsg('blkif_be_destroy_t',
|
||||
{ 'domid' : self.dom,
|
||||
'blkif_handle' : 0 })
|
||||
self.factory.writeRequest(msg)
|
||||
|
||||
def send_be_vbd_create(self, vdev):
|
||||
dev = self.devices[vdev]
|
||||
msg = packMsg('blkif_be_vbd_create_t',
|
||||
@@ -293,6 +318,8 @@ class BlkifController(controller.Controller):
|
||||
self.factory.writeRequest(msg)
|
||||
|
||||
def send_be_vbd_destroy(self, vdev):
|
||||
print '>BlkifController>send_be_vbd_destroy>', 'dom=', self.dom, 'vdev=', vdev
|
||||
PrettyPrint.prettyprint(self.sxpr())
|
||||
dev = self.devices[vdev]
|
||||
msg = packMsg('blkif_be_vbd_destroy_t',
|
||||
{ 'domid' : self.dom,
|
||||
|
||||
@@ -132,7 +132,7 @@ class Controller(CtrlMsgRcvr):
|
||||
|
||||
def close(self):
|
||||
self.deregisterChannel()
|
||||
self.lostChannel(self)
|
||||
self.lostChannel()
|
||||
|
||||
def lostChannel(self):
|
||||
self.factory.instanceClosed(self)
|
||||
|
||||
@@ -2,6 +2,8 @@ import random
|
||||
|
||||
from twisted.internet import defer
|
||||
|
||||
from xenmgr import sxp
|
||||
from xenmgr import PrettyPrint
|
||||
from xenmgr import XendBridge
|
||||
|
||||
import channel
|
||||
@@ -117,9 +119,13 @@ class NetDev(controller.Dev):
|
||||
def sxpr(self):
|
||||
vif = str(self.vif)
|
||||
mac = ':'.join(map(lambda x: "%x" % x, self.mac))
|
||||
val = ['netif', ['vif', vif], ['mac', mac]]
|
||||
val = ['netdev', ['vif', vif], ['mac', mac]]
|
||||
if self.bridge:
|
||||
val += ['bridge', self.bridge]
|
||||
val.append(['bridge', self.bridge])
|
||||
if self.evtchn:
|
||||
val.append(['evtchn',
|
||||
self.evtchn['port1'],
|
||||
self.evtchn['port2']])
|
||||
return val
|
||||
|
||||
def bridge_add(self, bridge):
|
||||
@@ -131,6 +137,8 @@ class NetDev(controller.Dev):
|
||||
self.bridge = None
|
||||
|
||||
def destroy(self):
|
||||
print 'NetDev>destroy>', 'vif=', self.vif
|
||||
PrettyPrint.prettyprint(self.sxpr())
|
||||
self.bridge_rem()
|
||||
self.controller.send_be_destroy(self.vif)
|
||||
|
||||
@@ -155,7 +163,10 @@ class NetifController(controller.Controller):
|
||||
self.registerChannel()
|
||||
#print 'NetifController<', 'dom=', self.dom, 'idx=', self.idx
|
||||
|
||||
|
||||
def sxpr(self):
|
||||
val = ['netif', ['dom', self.dom]]
|
||||
return val
|
||||
|
||||
def randomMAC(self):
|
||||
# VIFs get a random MAC address with a "special" vendor id.
|
||||
#
|
||||
@@ -194,6 +205,7 @@ class NetifController(controller.Controller):
|
||||
return dev
|
||||
|
||||
def destroy(self):
|
||||
print 'NetifController>destroy>', 'dom=', self.dom
|
||||
self.destroyDevices()
|
||||
|
||||
def destroyDevices(self):
|
||||
@@ -270,7 +282,8 @@ class NetifController(controller.Controller):
|
||||
self.factory.writeRequest(msg)
|
||||
|
||||
def send_be_destroy(self, vif):
|
||||
print 'send_be_destroy>', 'dom=', self.dom, 'vif=', vif
|
||||
print 'NetifController>send_be_destroy>', 'dom=', self.dom, 'vif=', vif
|
||||
PrettyPrint.prettyprint(self.sxpr())
|
||||
dev = self.devices[vif]
|
||||
del self.devices[vif]
|
||||
msg = packMsg('netif_be_destroy_t',
|
||||
|
||||