ia64/xen-unstable
changeset 2413:8b7e79495b43
bitkeeper revision 1.1159.68.3 (41385101Grb5mmJcQ0YiLdCY2dOnCg)
Notify device controllers when devices are added or removed so
that they can probe for the devices.
Notify device controllers when devices are added or removed so
that they can probe for the devices.
author | mjw@wray-m-3.hpl.hp.com |
---|---|
date | Fri Sep 03 11:09:53 2004 +0000 (2004-09-03) |
parents | 46918bf8df85 |
children | eb86f896d588 |
files | linux-2.6.8.1-xen-sparse/drivers/xen/blkfront/blkfront.c linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c tools/python/xen/xend/XendClient.py tools/python/xen/xend/XendDomainInfo.py tools/python/xen/xend/server/blkif.py tools/python/xen/xend/server/messages.py tools/python/xen/xend/server/netif.py tools/python/xen/xm/main.py xen/include/hypervisor-ifs/io/domain_controller.h |
line diff
1.1 --- a/linux-2.6.8.1-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Sep 03 09:43:59 2004 +0000 1.2 +++ b/linux-2.6.8.1-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Sep 03 11:09:53 2004 +0000 1.3 @@ -1148,6 +1148,12 @@ static void blkif_status_change(blkif_fe 1.4 1.5 break; 1.6 1.7 + case BLKIF_INTERFACE_STATUS_CHANGED: 1.8 + /* The domain controller is notifying us that a device has been 1.9 + * added or removed. 1.10 + */ 1.11 + break; 1.12 + 1.13 default: 1.14 printk(KERN_WARNING "Status change to unknown value %d\n", 1.15 status->status);
2.1 --- a/linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c Fri Sep 03 09:43:59 2004 +0000 2.2 +++ b/linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c Fri Sep 03 11:09:53 2004 +0000 2.3 @@ -771,6 +771,12 @@ static void netif_status_change(netif_fe 2.4 vif_wake(dev); 2.5 break; 2.6 2.7 + case NETIF_INTERFACE_STATUS_CHANGED: 2.8 + /* The domain controller is notifying us that a device has been 2.9 + * added or removed. 2.10 + */ 2.11 + break; 2.12 + 2.13 default: 2.14 printk(KERN_WARNING "Status change to unknown value %d\n", 2.15 status->status);
3.1 --- a/tools/python/xen/xend/XendClient.py Fri Sep 03 09:43:59 2004 +0000 3.2 +++ b/tools/python/xen/xend/XendClient.py Fri Sep 03 11:09:53 2004 +0000 3.3 @@ -548,7 +548,7 @@ class Xend: 3.4 return self.xendPost(self.domainurl(id), 3.5 {'op' : 'device_destroy', 3.6 'type' : type, 3.7 - 'index' : idx }) 3.8 + 'idx' : idx }) 3.9 3.10 def xend_consoles(self): 3.11 return self.xendGet(self.consoleurl())
4.1 --- a/tools/python/xen/xend/XendDomainInfo.py Fri Sep 03 09:43:59 2004 +0000 4.2 +++ b/tools/python/xen/xend/XendDomainInfo.py Fri Sep 03 11:09:53 2004 +0000 4.3 @@ -576,6 +576,16 @@ class XendDomainInfo: 4.4 dl.append(dev) 4.5 self.devices[type] = dl 4.6 4.7 + def remove_device(self, type, dev): 4.8 + """Remove a device from a virtual machine. 4.9 + 4.10 + @param type: device type 4.11 + @param dev: device 4.12 + """ 4.13 + dl = self.devices.get(type, []) 4.14 + if dev in dl: 4.15 + dl.remove(dev) 4.16 + 4.17 def get_devices(self, type): 4.18 """Get a list of the devices of a given type. 4.19 4.20 @@ -812,7 +822,7 @@ class XendDomainInfo: 4.21 devs = self.get_devices(dev_name) 4.22 dev_index = len(devs) 4.23 self.config.append(['device', dev_config]) 4.24 - d = dev_handler(self, dev_config, dev_index) 4.25 + d = dev_handler(self, dev_config, dev_index, change=1) 4.26 return d 4.27 4.28 def device_destroy(self, type, idx): 4.29 @@ -829,7 +839,8 @@ class XendDomainInfo: 4.30 dev_config = self.config_device(type, index) 4.31 if dev_config: 4.32 self.config.remove(['device', dev_config]) 4.33 - dev.destroy() 4.34 + dev.destroy(change=1) 4.35 + self.remove_device(type, dev) 4.36 4.37 def configure_memory(self): 4.38 """Configure vm memory limit. 4.39 @@ -1053,7 +1064,7 @@ def vm_image_netbsd(vm, image): 4.40 return vm 4.41 4.42 4.43 -def vm_dev_vif(vm, val, index): 4.44 +def vm_dev_vif(vm, val, index, change=0): 4.45 """Create a virtual network interface (vif). 4.46 4.47 @param vm: virtual machine 4.48 @@ -1069,11 +1080,13 @@ def vm_dev_vif(vm, val, index): 4.49 def cbok(dev): 4.50 dev.vifctl('up', vmname=vm.name) 4.51 vm.add_device('vif', dev) 4.52 + if change: 4.53 + dev.interfaceChanged() 4.54 return dev 4.55 defer.addCallback(cbok) 4.56 return defer 4.57 4.58 -def vm_dev_vbd(vm, val, index): 4.59 +def vm_dev_vbd(vm, val, index, change=0): 4.60 """Create a virtual block device (vbd). 4.61 4.62 @param vm: virtual machine 4.63 @@ -1094,6 +1107,8 @@ def vm_dev_vbd(vm, val, index): 4.64 vbd.dev = dev 4.65 vbd.uname = uname 4.66 vm.add_device('vbd', vbd) 4.67 + if change: 4.68 + vbd.interfaceChanged() 4.69 return vbd 4.70 defer.addCallback(fn) 4.71 return defer 4.72 @@ -1110,7 +1125,7 @@ def parse_pci(val): 4.73 v = val 4.74 return v 4.75 4.76 -def vm_dev_pci(vm, val, index): 4.77 +def vm_dev_pci(vm, val, index, change=0): 4.78 """Add a pci device. 4.79 4.80 @param vm: virtual machine
5.1 --- a/tools/python/xen/xend/server/blkif.py Fri Sep 03 09:43:59 2004 +0000 5.2 +++ b/tools/python/xen/xend/server/blkif.py Fri Sep 03 11:09:53 2004 +0000 5.3 @@ -3,7 +3,6 @@ 5.4 """ 5.5 5.6 from twisted.internet import defer 5.7 -#defer.Deferred.debug = 1 5.8 5.9 from xen.xend import sxp 5.10 from xen.xend.XendLogging import log 5.11 @@ -88,14 +87,12 @@ class BlkifBackendInterface(controller.B 5.12 self.send_be_disconnect(response=d) 5.13 5.14 def send_be_disconnect(self, response=None): 5.15 - log.debug('>BlkifBackendController>send_be_disconnect> %s', str(self)) 5.16 msg = packMsg('blkif_be_disconnect_t', 5.17 { 'domid' : self.controller.dom, 5.18 'blkif_handle' : self.handle }) 5.19 self.writeRequest(msg, response=response) 5.20 5.21 def send_be_destroy(self, response=None): 5.22 - log.debug('>BlkifBackendController>send_be_destroy> %s', str(self)) 5.23 msg = packMsg('blkif_be_destroy_t', 5.24 { 'domid' : self.controller.dom, 5.25 'blkif_handle' : self.handle }) 5.26 @@ -127,9 +124,28 @@ class BlkifBackendInterface(controller.B 5.27 msg = packMsg('blkif_fe_interface_status_changed_t', 5.28 { 'handle' : self.handle, 5.29 'status' : BLKIF_INTERFACE_STATUS_CONNECTED, 5.30 - 'domid' : 0, ## FIXME: should be domid of backend 5.31 + 'domid' : self.dom, 5.32 'evtchn' : self.evtchn['port2'] }) 5.33 self.controller.writeRequest(msg, response=response) 5.34 + 5.35 + def interfaceDisconnected(self): 5.36 + msg = packMsg('blkif_fe_interface_status_changed_t', 5.37 + { 'handle' : self.handle, 5.38 + 'status' : BLKIF_INTERFACE_STATUS_DISCONNECTED, 5.39 + 'domid' : self.dom, 5.40 + 'evtchn' : 0 }) 5.41 + self.controller.writeRequest(msg) 5.42 + 5.43 + def interfaceChanged(self): 5.44 + """Notify the front-end that devices have been added or removed. 5.45 + The front-end should then probe for devices. 5.46 + """ 5.47 + msg = packMsg('blkif_fe_interface_status_changed_t', 5.48 + { 'handle' : self.handle, 5.49 + 'status' : BLKIF_INTERFACE_STATUS_CHANGED, 5.50 + 'domid' : self.dom, 5.51 + 'evtchn' : 0 }) 5.52 + self.controller.writeRequest(msg) 5.53 5.54 class BlkifControllerFactory(controller.SplitControllerFactory): 5.55 """Factory for creating block device interface controllers. 5.56 @@ -230,9 +246,21 @@ class BlkDev(controller.SplitDev): 5.57 val.append(['uname', self.uname]) 5.58 return val 5.59 5.60 - def destroy(self): 5.61 + def destroy(self, change=0): 5.62 + """Destroy the device. If 'change' is true notify the front-end interface. 5.63 + 5.64 + @param change: change flag 5.65 + """ 5.66 log.debug("Destroying vbd domain=%d vdev=%d", self.controller.dom, self.vdev) 5.67 - self.send_be_vbd_destroy() 5.68 + d = self.send_be_vbd_destroy() 5.69 + if change: 5.70 + d.addCallback(lambda val: self.interfaceChanged()) 5.71 + 5.72 + def interfaceChanged(self): 5.73 + """Tell the back-end to notify the front-end that a device has been 5.74 + added or removed. 5.75 + """ 5.76 + self.getBackendInterface().interfaceChanged() 5.77 5.78 def attach(self): 5.79 """Attach the device to its controller. 5.80 @@ -295,16 +323,16 @@ class BlkDev(controller.SplitDev): 5.81 % (self.vdev, status)) 5.82 return self 5.83 5.84 - def send_be_vbd_destroy(self, response=None): 5.85 - log.debug('>BlkDev>send_be_vbd_destroy> dom=%d vdev=%d', 5.86 - self.controller.dom, self.vdev) 5.87 + def send_be_vbd_destroy(self): 5.88 + d = defer.Deferred() 5.89 backend = self.getBackendInterface() 5.90 msg = packMsg('blkif_be_vbd_destroy_t', 5.91 { 'domid' : self.controller.dom, 5.92 'blkif_handle' : backend.handle, 5.93 'vdevice' : self.vdev }) 5.94 self.controller.delDevice(self.vdev) 5.95 - backend.writeRequest(msg, response=response) 5.96 + backend.writeRequest(msg, response=d) 5.97 + return d 5.98 5.99 5.100 class BlkifController(controller.SplitController): 5.101 @@ -399,13 +427,8 @@ class BlkifController(controller.SplitCo 5.102 5.103 def recv_fe_driver_status_changed(self, msg, req): 5.104 val = unpackMsg('blkif_fe_driver_status_changed_t', msg) 5.105 - # For each backend? 5.106 - msg = packMsg('blkif_fe_interface_status_changed_t', 5.107 - { 'handle' : 0, 5.108 - 'status' : BLKIF_INTERFACE_STATUS_DISCONNECTED, 5.109 - 'domid' : 0, ## FIXME: should be domid of backend 5.110 - 'evtchn' : 0 }) 5.111 - self.writeRequest(msg) 5.112 + for backend in self.getBackendInterfaces(): 5.113 + backend.interfaceDisconnected() 5.114 5.115 def recv_fe_interface_connect(self, msg, req): 5.116 val = unpackMsg('blkif_fe_interface_connect_t', msg)
6.1 --- a/tools/python/xen/xend/server/messages.py Fri Sep 03 09:43:59 2004 +0000 6.2 +++ b/tools/python/xen/xend/server/messages.py Fri Sep 03 11:09:53 2004 +0000 6.3 @@ -50,6 +50,7 @@ BLKIF_DRIVER_STATUS_UP = 1 6.4 BLKIF_INTERFACE_STATUS_DESTROYED = 0 #/* Interface doesn't exist. */ 6.5 BLKIF_INTERFACE_STATUS_DISCONNECTED = 1 #/* Exists but is disconnected. */ 6.6 BLKIF_INTERFACE_STATUS_CONNECTED = 2 #/* Exists and is connected. */ 6.7 +BLKIF_INTERFACE_STATUS_CHANGED = 3 #/* A device has been added or removed. */ 6.8 6.9 BLKIF_BE_STATUS_OKAY = 0 6.10 BLKIF_BE_STATUS_ERROR = 1 6.11 @@ -117,6 +118,7 @@ CMSG_NETIF_BE_DRIVER_STATUS_CHANGED = 6.12 NETIF_INTERFACE_STATUS_DESTROYED = 0 #/* Interface doesn't exist. */ 6.13 NETIF_INTERFACE_STATUS_DISCONNECTED = 1 #/* Exists but is disconnected. */ 6.14 NETIF_INTERFACE_STATUS_CONNECTED = 2 #/* Exists and is connected. */ 6.15 +NETIF_INTERFACE_STATUS_CHANGED = 3 #/* A device has been added or removed. */ 6.16 6.17 NETIF_DRIVER_STATUS_DOWN = 0 6.18 NETIF_DRIVER_STATUS_UP = 1
7.1 --- a/tools/python/xen/xend/server/netif.py Fri Sep 03 09:43:59 2004 +0000 7.2 +++ b/tools/python/xen/xend/server/netif.py Fri Sep 03 11:09:53 2004 +0000 7.3 @@ -5,7 +5,6 @@ 7.4 import random 7.5 7.6 from twisted.internet import defer 7.7 -#defer.Deferred.debug = 1 7.8 7.9 from xen.xend import sxp 7.10 from xen.xend import Vifctl 7.11 @@ -208,13 +207,17 @@ class NetDev(controller.SplitDev): 7.12 val = unpackMsg('netif_be_create_t', msg) 7.13 return self 7.14 7.15 - def destroy(self): 7.16 + def destroy(self, change=0): 7.17 """Destroy the device's resources and disconnect from the back-end 7.18 - device controller. 7.19 + device controller. If 'change' is true notify the front-end interface. 7.20 + 7.21 + @param change: change flag 7.22 """ 7.23 def cb_destroy(val): 7.24 self.send_be_destroy() 7.25 self.getBackendInterface().close() 7.26 + if change: 7.27 + self.interfaceChanged() 7.28 log.debug("Destroying vif domain=%d vif=%d", self.controller.dom, self.vif) 7.29 self.vifctl('down') 7.30 d = self.send_be_disconnect() 7.31 @@ -256,7 +259,7 @@ class NetDev(controller.SplitDev): 7.32 { 'handle' : self.vif, 7.33 'status' : NETIF_INTERFACE_STATUS_CONNECTED, 7.34 'evtchn' : self.evtchn['port2'], 7.35 - 'domid' : 0, ## FIXME: should be domid of backend 7.36 + 'domid' : self.backendDomain, 7.37 'mac' : self.mac }) 7.38 self.controller.writeRequest(msg) 7.39 7.40 @@ -265,7 +268,19 @@ class NetDev(controller.SplitDev): 7.41 { 'handle' : self.vif, 7.42 'status' : NETIF_INTERFACE_STATUS_DISCONNECTED, 7.43 'evtchn' : 0, 7.44 - 'domid' : 0, ## FIXME: should be domid of backend 7.45 + 'domid' : self.backendDomain, 7.46 + 'mac' : self.mac }) 7.47 + self.controller.writeRequest(msg) 7.48 + 7.49 + def interfaceChanged(self): 7.50 + """Notify the font-end that a device has been added or removed. 7.51 + The front-end should then probe the devices. 7.52 + """ 7.53 + msg = packMsg('netif_fe_interface_status_changed_t', 7.54 + { 'handle' : self.vif, 7.55 + 'status' : NETIF_INTERFACE_STATUS_CHANGED, 7.56 + 'evtchn' : 0, 7.57 + 'domid' : self.backendDomain, 7.58 'mac' : self.mac }) 7.59 self.controller.writeRequest(msg) 7.60
8.1 --- a/tools/python/xen/xm/main.py Fri Sep 03 09:43:59 2004 +0000 8.2 +++ b/tools/python/xen/xm/main.py Fri Sep 03 11:09:53 2004 +0000 8.3 @@ -737,22 +737,26 @@ class ProgVbdCreate(Prog): 8.4 info = """Create a new virtual block device for a domain""" 8.5 8.6 def help(self, args): 8.7 - print args[0], "DOM UNAME DEV MODE" 8.8 + print args[0], "DOM UNAME DEV MODE [BACKEND]" 8.9 print """ 8.10 Create a virtual block device for a domain. 8.11 8.12 - UNAME - device to export, e.g. phys:hda2 8.13 - DEV - device name in the domain, e.g. xda1 8.14 - MODE - access mode: r for read, w for read-write 8.15 + UNAME - device to export, e.g. phy:hda2 8.16 + DEV - device name in the domain, e.g. xda1 8.17 + MODE - access mode: r for read, w for read-write 8.18 + BACKEND - backend driver domain 8.19 """ 8.20 8.21 def main(self, args): 8.22 - if len(args) != 5: self.err("%s: Invalid argument(s)" % args[0]) 8.23 + n = len(args) 8.24 + if n < 5 or n > 6: self.err("%s: Invalid argument(s)" % args[0]) 8.25 dom = args[1] 8.26 vbd = ['vbd', 8.27 ['uname', args[2]], 8.28 ['dev', args[3]], 8.29 ['mode', args[4]]] 8.30 + if n == 6: 8.31 + vbd.append(['backend', args[5]]) 8.32 server.xend_domain_device_create(dom, vbd) 8.33 8.34 xm.prog(ProgVbdCreate) 8.35 @@ -766,13 +770,15 @@ class ProgVbdDestroy(Prog): 8.36 print args[0], "DOM DEV" 8.37 print """ 8.38 Destroy vbd DEV attached to domain DOM. Detaches the device 8.39 -from the domain, but does not destroy the device contents.""" 8.40 +from the domain, but does not destroy the device contents. 8.41 +The device indentifier DEV is the idx field in the device 8.42 +information. This is visible in 'xm vbd-list'.""" 8.43 8.44 def main(self, args): 8.45 - if len(args!=3): self.err("%s: Invalid argument(s)" % args[0]) 8.46 + if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0]) 8.47 dom = args[1] 8.48 dev = args[2] 8.49 - sever.xend_domain_device_destroy(dom, "vbd", dev) 8.50 + server.xend_domain_device_destroy(dom, "vbd", dev) 8.51 8.52 xm.prog(ProgVbdDestroy) 8.53
9.1 --- a/xen/include/hypervisor-ifs/io/domain_controller.h Fri Sep 03 09:43:59 2004 +0000 9.2 +++ b/xen/include/hypervisor-ifs/io/domain_controller.h Fri Sep 03 11:09:53 2004 +0000 9.3 @@ -93,6 +93,7 @@ typedef struct { 9.4 #define BLKIF_INTERFACE_STATUS_DESTROYED 0 /* Interface doesn't exist. */ 9.5 #define BLKIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */ 9.6 #define BLKIF_INTERFACE_STATUS_CONNECTED 2 /* Exists and is connected. */ 9.7 +#define BLKIF_INTERFACE_STATUS_CHANGED 3 /* A device has been added or removed. */ 9.8 typedef struct { 9.9 u32 handle; /* 0 */ 9.10 u32 status; /* 4 */ 9.11 @@ -357,6 +358,7 @@ typedef struct { 9.12 #define NETIF_INTERFACE_STATUS_DESTROYED 0 /* Interface doesn't exist. */ 9.13 #define NETIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */ 9.14 #define NETIF_INTERFACE_STATUS_CONNECTED 2 /* Exists and is connected. */ 9.15 +#define NETIF_INTERFACE_STATUS_CHANGED 3 /* A device has been added or removed. */ 9.16 typedef struct { 9.17 u32 handle; /* 0 */ 9.18 u32 status; /* 4 */