From: BitKeeper B. <ri...@su...> - 2004-09-03 03:00:38
|
ChangeSet 1.1268, 2004/08/26 17:30:13+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk blkif.py | 81 ++++++++++++++++++++++++++++++++++++++++----------------------- netif.py | 67 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 96 insertions(+), 52 deletions(-) diff -Nru a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py --- a/tools/python/xen/xend/server/blkif.py 2004-09-02 23:00:35 -04:00 +++ b/tools/python/xen/xend/server/blkif.py 2004-09-02 23:00:35 -04:00 @@ -14,24 +14,16 @@ from messages import * class BlkifBackendController(controller.BackendController): - """ Handler for the 'back-end' channel to a device driver domain. - Must be connected using connect() before it can be used. - Do not create directly - use getBackend() on the BlkifController. + """ Handler for the 'back-end' channel to a block device driver domain. """ - def __init__(self, ctrl, dom, handle): - controller.BackendController.__init__(self, ctrl, dom, handle) - self.connected = 0 - self.evtchn = None - self.handle = handle + def __init__(self, factory, dom): + controller.BackendController.__init__(self, factory, dom) self.addMethod(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DRIVER_STATUS_CHANGED, self.recv_be_driver_status_changed) self.registerChannel() - def __str__(self): - return '<BlkifBackendController %d %d>' % (self.controller.dom, self.dom) - def recv_be_driver_status_changed(self, msg, req): """Request handler for be_driver_status_changed messages. @@ -43,8 +35,23 @@ val = unpackMsg('blkif_be_driver_status_changed_t', msg) status = val['status'] +class BlkifBackendInterface(controller.BackendInterface): + """ Handler for the 'back-end' channel to a block device driver domain + on behalf of a front-end domain. + Must be connected using connect() before it can be used. + Do not create directly - use getBackendInterface() on the BlkifController. + """ + + def __init__(self, ctrl, dom, handle): + controller.BackendInterface.__init__(self, ctrl, dom, handle) + self.connected = 0 + self.evtchn = None + + def __str__(self): + return '<BlkifBackendInterface %d %d>' % (self.controller.dom, self.dom) + def connect(self, recreate=0): - """Connect the controller to the blkif control interface. + """Connect to the blkif control interface. @param recreate: true if after xend restart @return: deferred @@ -76,6 +83,7 @@ """ def cb_destroy(val): self.send_be_destroy() + self.close() d = defer.Deferred() d.addCallback(cb_destroy) self.send_be_disconnect(response=d) @@ -125,14 +133,14 @@ 'evtchn' : self.evtchn['port2'] }) self.controller.writeRequest(msg, response=response) -class BlkifControllerFactory(controller.ControllerFactory): +class BlkifControllerFactory(controller.SplitControllerFactory): """Factory for creating block device interface controllers. """ def __init__(self): - controller.ControllerFactory.__init__(self) + controller.SplitControllerFactory.__init__(self) - def createInstance(self, dom, recreate=0): + def createController(self, dom, recreate=0): """Create a block device controller for a domain. @param dom: domain @@ -142,12 +150,30 @@ @return: block device controller @rtype: BlkifController """ - blkif = self.getInstanceByDom(dom) + blkif = self.getControllerByDom(dom) if blkif is None: blkif = BlkifController(self, dom) - self.addInstance(blkif) + self.addController(blkif) return blkif + def createBackendController(self, dom): + """Create a block device backend controller. + + @param dom: backend domain + @return: backend controller + """ + return BlkifBackendController(self, dom) + + def createBackendInterface(self, ctrl, dom, handle): + """Create a block device backend interface. + + @param ctrl: controller + @param dom: backend domain + @param handle: interface handle + @return: backend interface + """ + return BlkifBackendInterface(ctrl, dom, handle) + def getDomainDevices(self, dom): """Get the block devices for a domain. @@ -156,7 +182,7 @@ @return: devices @rtype: [device] """ - blkif = self.getInstanceByDom(dom) + blkif = self.getControllerByDom(dom) return (blkif and blkif.getDevices()) or [] def getDomainDevice(self, dom, vdev): @@ -169,7 +195,7 @@ @return: device @rtype: device """ - blkif = self.getInstanceByDom(dom) + blkif = self.getControllerByDom(dom) return (blkif and blkif.getDevice(vdev)) or None class BlkDev(controller.SplitDev): @@ -214,7 +240,7 @@ """Attach the device to its controller. """ - backend = self.getBackend() + backend = self.getBackendInterface() d1 = backend.connect() d2 = defer.Deferred() d2.addCallback(self.send_be_vbd_create) @@ -224,7 +250,7 @@ def send_be_vbd_create(self, val): d = defer.Deferred() d.addCallback(self.respond_be_vbd_create) - backend = self.getBackend() + backend = self.getBackendInterface() msg = packMsg('blkif_be_vbd_create_t', { 'domid' : self.controller.dom, 'blkif_handle' : backend.handle, @@ -247,7 +273,7 @@ def send_be_vbd_grow(self): d = defer.Deferred() - backend = self.getBackend() + backend = self.getBackendInterface() msg = packMsg('blkif_be_vbd_grow_t', { 'domid' : self.controller.dom, 'blkif_handle' : backend.handle, @@ -274,7 +300,7 @@ def send_be_vbd_destroy(self, response=None): log.debug('>BlkDev>send_be_vbd_destroy> dom=%d vdev=%d', self.controller.dom, self.vdev) - backend = self.getBackend() + backend = self.getBackendInterface() msg = packMsg('blkif_be_vbd_destroy_t', { 'domid' : self.controller.dom, 'blkif_handle' : backend.handle, @@ -290,7 +316,7 @@ def __init__(self, factory, dom): """Create a block device controller. - Do not call directly - use createInstance() on the factory instead. + Do not call directly - use createController() on the factory instead. """ controller.SplitController.__init__(self, factory, dom) self.devices = {} @@ -306,9 +332,6 @@ val = ['blkif', ['dom', self.dom]] return val - def createBackend(self, dom, handle): - return BlkifBackendController(self, dom, handle) - def getDevices(self): return self.devices.values() @@ -373,7 +396,7 @@ dev.destroy() def destroyBackends(self): - for backend in self.getBackends(): + for backend in self.getBackendInterfaces(): backend.destroy() def recv_fe_driver_status_changed(self, msg, req): @@ -390,7 +413,7 @@ def recv_fe_interface_connect(self, msg, req): val = unpackMsg('blkif_fe_interface_connect_t', msg) handle = val['handle'] - backend = self.getBackendByHandle(handle) + backend = self.getBackendInterfaceByHandle(handle) if backend: backend.connectInterface(val) else: diff -Nru a/tools/python/xen/xend/server/netif.py b/tools/python/xen/xend/server/netif.py --- a/tools/python/xen/xend/server/netif.py 2004-09-02 23:00:35 -04:00 +++ b/tools/python/xen/xend/server/netif.py 2004-09-02 23:00:35 -04:00 @@ -19,11 +19,11 @@ from messages import * class NetifBackendController(controller.BackendController): - """Handler for the 'back-end' channel to a device driver domain. + """Handler for the 'back-end' channel to a network device driver domain. """ - def __init__(self, ctrl, dom, handle): - controller.BackendController.__init__(self, ctrl, dom, handle) + def __init__(self, ctrl, dom): + controller.BackendController.__init__(self, ctrl, dom) self.addMethod(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS_CHANGED, self.recv_be_driver_status_changed) @@ -33,33 +33,56 @@ val = unpackMsg('netif_be_driver_status_changed_t', msg) status = val['status'] -class NetifControllerFactory(controller.ControllerFactory): +class NetifBackendInterface(controller.BackendInterface): + """Handler for the 'back-end' channel to a network device driver domain + on behalf of a front-end domain. + + Each network device is handled separately, so we add no functionality + here. + """ + + pass + +class NetifControllerFactory(controller.SplitControllerFactory): """Factory for creating network interface controllers. """ def __init__(self): - controller.ControllerFactory.__init__(self) + controller.SplitControllerFactory.__init__(self) - def createInstance(self, dom, recreate=0): - """Create or find the network interface controller for a domain. + def createController(self, dom): |
From: BitKeeper B. <ri...@su...> - 2004-09-03 03:00:53
|
ChangeSet 1.1268.1.1, 2004/09/01 10:48:38+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk netif.py | 67 +++++++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 44 insertions(+), 23 deletions(-) diff -Nru a/tools/python/xen/xend/server/netif.py b/tools/python/xen/xend/server/netif.py --- a/tools/python/xen/xend/server/netif.py 2004-09-02 23:00:49 -04:00 +++ b/tools/python/xen/xend/server/netif.py 2004-09-02 23:00:49 -04:00 @@ -19,11 +19,11 @@ from messages import * class NetifBackendController(controller.BackendController): - """Handler for the 'back-end' channel to a device driver domain. + """Handler for the 'back-end' channel to a network device driver domain. """ - def __init__(self, ctrl, dom, handle): - controller.BackendController.__init__(self, ctrl, dom, handle) + def __init__(self, ctrl, dom): + controller.BackendController.__init__(self, ctrl, dom) self.addMethod(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS_CHANGED, self.recv_be_driver_status_changed) @@ -33,33 +33,56 @@ val = unpackMsg('netif_be_driver_status_changed_t', msg) status = val['status'] -class NetifControllerFactory(controller.ControllerFactory): +class NetifBackendInterface(controller.BackendInterface): + """Handler for the 'back-end' channel to a network device driver domain + on behalf of a front-end domain. + + Each network device is handled separately, so we add no functionality + here. + """ + + pass + +class NetifControllerFactory(controller.SplitControllerFactory): """Factory for creating network interface controllers. """ def __init__(self): - controller.ControllerFactory.__init__(self) + controller.SplitControllerFactory.__init__(self) - def createInstance(self, dom, recreate=0): - """Create or find the network interface controller for a domain. + def createController(self, dom): + """Create a network interface controller for a domain. @param dom: domain - @param recreate: if true this is a recreate (xend restarted) @return: netif controller """ - netif = self.getInstanceByDom(dom) - if netif is None: - netif = NetifController(self, dom) - self.addInstance(netif) - return netif + return NetifController(self, dom) + + def createBackendController(self, dom): + """Create a network device backend controller. + + @param dom: backend domain + @return: backend controller + """ + return NetifBackendController(self, dom) + + def createBackendInterface(self, ctrl, dom, handle): + """Create a network device backend interface. + + @param ctrl: controller + @param dom: backend domain + @param handle: interface handle + @return: backend interface + """ + return NetifBackendInterface(ctrl, dom, handle) def getDomainDevices(self, dom): - """Get the network device controllers for a domain. + """Get the network devices for a domain. @param dom: domain @return: netif controller list """ - netif = self.getInstanceByDom(dom) + netif = self.getControllerByDom(dom) return (netif and netif.getDevices()) or [] def getDomainDevice(self, dom, vif): @@ -69,7 +92,7 @@ @param vif: virtual interface index @return: NetDev """ - netif = self.getInstanceByDom(dom) + netif = self.getControllerByDom(dom) return (netif and netif.getDevice(vif)) or None class NetDev(controller.SplitDev): @@ -179,7 +202,7 @@ { 'domid' : self.controller.dom, 'netif_handle' : self.vif, 'mac' : self.mac }) - self.getBackend().writeRequest(msg, response=d) + self.getBackendInterface().writeRequest(msg, response=d) return d def respond_be_create(self, msg): @@ -193,6 +216,7 @@ """ def cb_destroy(val): self.send_be_destroy() + self.getBackendInterface().close() log.debug("Destroying vif domain=%d vif=%d", self.controller.dom, self.vif) self.vifctl('down') d = self.send_be_disconnect() @@ -203,7 +227,7 @@ msg = packMsg('netif_be_disconnect_t', { 'domid' : self.controller.dom, 'netif_handle' : self.vif }) - self.getBackend().writeRequest(msg, response=d) + self.getBackendInterface().writeRequest(msg, response=d) return d def send_be_destroy(self, response=None): @@ -211,7 +235,7 @@ { 'domid' : self.controller.dom, 'netif_handle' : self.vif }) self.controller.delDevice(self.vif) - self.getBackend().writeRequest(msg, response=response) + self.getBackendInterface().writeRequest(msg, response=response) def recv_fe_interface_connect(self, val, req): if not req: return @@ -224,7 +248,7 @@ 'rx_shmem_frame' : val['rx_shmem_frame'] }) d = defer.Deferred() d.addCallback(self.respond_be_connect) - self.getBackend().writeRequest(msg, response=d) + self.getBackendInterface().writeRequest(msg, response=d) def respond_be_connect(self, msg): val = unpackMsg('netif_be_connect_t', msg) @@ -261,9 +285,6 @@ CMSG_NETIF_FE_INTERFACE_CONNECT, self.recv_fe_interface_connect) self.registerChannel() - - def createBackend(self, dom, handle): - return NetifBackendController(self, dom, handle) def sxpr(self): val = ['netif', ['dom', self.dom]] |
From: BitKeeper B. <ri...@su...> - 2004-09-03 03:01:06
|
ChangeSet 1.1268.1.2, 2004/09/02 10:42:13+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk 0 files changed |
From: BitKeeper B. <ri...@su...> - 2004-09-04 05:04:47
|
ChangeSet 1.1280.1.1, 2004/09/03 12:55:11+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk 0 files changed |
From: BitKeeper B. <ri...@su...> - 2004-09-22 22:04:47
|
ChangeSet 1.1322, 2004/09/21 09:53:13+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk 0 files changed |
From: BitKeeper B. <ri...@su...> - 2004-09-24 17:01:25
|
ChangeSet 1.1327.1.1, 2004/09/24 14:50:07+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk netfront.c | 686 +++++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 441 insertions(+), 245 deletions(-) diff -Nru a/linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c 2004-09-24 13:01:23 -04:00 +++ b/linux-2.6.8.1-xen-sparse/drivers/xen/netfront/netfront.c 2004-09-24 13:01:23 -04:00 @@ -29,13 +29,30 @@ #include <net/arp.h> #include <net/route.h> -#if 0 +#define DEBUG 0 + +#if DEBUG + #define DPRINTK(fmt, args...) \ printk(KERN_INFO "[XEN] %s" fmt, __FUNCTION__, ##args) + #else + #define DPRINTK(fmt, args...) ((void)0) + #endif +#define IPRINTK(fmt, args...) \ + printk(KERN_INFO "[XEN]" fmt, ##args) + +#define WPRINTK(fmt, args...) \ + printk(KERN_WARNING "[XEN]" fmt, ##args) + +#define EPRINTK(fmt, args...) \ + printk(KERN_ERROR "[XEN]" fmt, ##args) + + + #ifndef __GFP_NOWARN #define __GFP_NOWARN 0 #endif @@ -111,6 +128,24 @@ struct sk_buff *rx_skbs[NETIF_RX_RING_SIZE+1]; }; +static char * status_name[] = { + [NETIF_INTERFACE_STATUS_CLOSED] = "closed", + [NETIF_INTERFACE_STATUS_DISCONNECTED] = "disconnected", + [NETIF_INTERFACE_STATUS_CONNECTED] = "connected", + [NETIF_INTERFACE_STATUS_CHANGED] = "changed", +}; + +static char * be_state_name[] = { + [BEST_CLOSED] = "closed", + [BEST_DISCONNECTED] = "disconnected", + [BEST_CONNECTED] = "connected", +}; + +static char * user_state_name[] = { + [UST_CLOSED] = "closed", + [UST_OPEN] = "open", +}; + /* Access macros for acquiring freeing slots in {tx,rx}_skbs[]. */ #define ADD_ID_TO_FREELIST(_list, _id) \ (_list)[(_id)] = (_list)[0]; \ @@ -141,6 +176,7 @@ int connected_n; /** Error code. */ int err; + int up; }; static struct netif_ctrl netctrl; @@ -148,15 +184,16 @@ static void netctrl_init(void) { memset(&netctrl, 0, sizeof(netctrl)); - netctrl.interface_n = -1; + netctrl.up = NETIF_DRIVER_STATUS_DOWN; } /** Get or set a network interface error. */ static int netctrl_err(int err) { - if ( (err < 0) && !netctrl.err ) + if ( (err < 0) && !netctrl.err ){ netctrl.err = err; + } return netctrl.err; } @@ -167,8 +204,12 @@ static int netctrl_connected(void) { int ok = 0; - ok = (netctrl.err ? netctrl.err : - (netctrl.connected_n == netctrl.interface_n)); + + if(netctrl.err){ + ok = netctrl.err; + } else if(netctrl.up == NETIF_DRIVER_STATUS_UP){ + ok = (netctrl.connected_n == netctrl.interface_n); + } return ok; } @@ -185,11 +226,11 @@ connected = 0; - list_for_each(ent, &dev_list) - { + list_for_each(ent, &dev_list) { np = list_entry(ent, struct net_private, list); - if ( np->backend_state == BEST_CONNECTED ) + if (np->backend_state == BEST_CONNECTED){ connected++; + } } netctrl.connected_n = connected; @@ -637,7 +678,7 @@ static void network_connect(struct net_device *dev, - netif_fe_interface_status_changed_t *status) + netif_fe_interface_status_t *status) { struct net_private *np; int i, requeue_idx; @@ -695,8 +736,8 @@ wmb(); np->rx->req_prod = requeue_idx; -printk(KERN_ALERT"Netfront recovered tx=%d rxfree=%d\n", - np->tx->req_prod,np->rx->req_prod); + printk(KERN_ALERT "[XEN] Netfront recovered tx=%d rxfree=%d\n", + np->tx->req_prod,np->rx->req_prod); /* Step 3: All public and private state should now be sane. Get @@ -716,130 +757,155 @@ spin_unlock_irq(&np->tx_lock); } -static void netif_status_change(netif_fe_interface_status_changed_t *status) -{ - ctrl_msg_t cmsg; - netif_fe_interface_connect_t up; - struct net_device *dev; - struct net_private *np; - - DPRINTK(">\n"); - DPRINTK("> status=%d handle=%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n", - status->status, - status->handle, - status->mac[0], status->mac[1], status->mac[2], - status->mac[3], status->mac[4], status->mac[5]); - - if ( netctrl.interface_n <= 0 ) - { - printk(KERN_WARNING "Status change: no interfaces\n"); - return; +static void vif_show(struct net_private *np){ +#if DEBUG + if(np){ + IPRINTK(" <vif handle=%u %s(%s) evtchn=%u irq=%u tx=%p rx=%p>\n", + np->handle, + be_state_name[np->backend_state], + user_state_name[np->user_state], + np->evtchn, + np->irq, + np->tx, + np->rx); + } else { + IPRINTK("<vif NULL>\n"); } +#endif +} - dev = find_dev_by_handle(status->handle); - if(!dev){ - printk(KERN_WARNING "Status change: invalid netif handle %u\n", - status->handle); - return; - } - np = dev->priv; - - switch ( status->status ) - { - case NETIF_INTERFACE_STATUS_DESTROYED: - printk(KERN_WARNING "Unexpected netif-DESTROYED message in state %d\n", - np->backend_state); - break; +/* Send a connect message to xend to tell it to bring up the interface. + */ +static void send_interface_connect(struct net_private *np){ + ctrl_msg_t cmsg = { + .type = CMSG_NETIF_FE, + .subtype = CMSG_NETIF_FE_INTERFACE_CONNECT, + .length = sizeof(netif_fe_interface_connect_t), + }; + netif_fe_interface_connect_t *msg = (void*)cmsg.msg; + + DPRINTK(">\n"); vif_show(np); + msg->handle = np->handle; + msg->tx_shmem_frame = (virt_to_machine(np->tx) >> PAGE_SHIFT); + msg->rx_shmem_frame = (virt_to_machine(np->rx) >> PAGE_SHIFT); + + ctrl_if_send_message_block(&cmsg, NULL, 0, TASK_UNINTERRUPTIBLE); + DPRINTK("<\n"); +} - case NETIF_INTERFACE_STATUS_DISCONNECTED: - if ( np->backend_state != BEST_CLOSED ) - { - printk(KERN_WARNING "Unexpected netif-DISCONNECTED message" - " in state %d\n", np->backend_state); - printk(KERN_INFO "Attempting to reconnect network interface\n"); - - /* Begin interface recovery. - * - * NB. Whilst we're recovering, we turn the carrier state off. We - * take measures to ensure that this device isn't used for - * anything. We also stop the queue for this device. Various - * different approaches (e.g. continuing to buffer packets) have - * been tested but don't appear to improve the overall impact on - * TCP connections. - * - * TODO: (MAW) Change the Xend<->Guest protocol so that a recovery - * is initiated by a special "RESET" message - disconnect could - * just mean we're not allowed to use this interface any more. - */ - - /* Stop old i/f to prevent errors whilst we rebuild the state. */ - spin_lock_irq(&np->tx_lock); - spin_lock(&np->rx_lock); - netif_stop_queue(dev); - np->backend_state = BEST_DISCONNECTED; - spin_unlock(&np->rx_lock); - spin_unlock_irq(&np->tx_lock); - - /* Free resources. */ - free_irq(np->irq, dev); - unbind_evtchn_from_irq(np->evtchn); - free_page((unsigned long)np->tx); - free_page((unsigned long)np->rx); - } +/* Send a driver status notification to the domain controller. */ +static int send_driver_status(int ok) +{ + int err = 0; + ctrl_msg_t cmsg = { + .type = CMSG_NETIF_FE, |
From: BitKeeper B. <ri...@su...> - 2004-10-22 17:01:05
|
ChangeSet 1.1397.4.1, 2004/10/19 12:16:51+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk XendDomainInfo.py | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletion(-) diff -Nru a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py 2004-10-22 13:01:02 -04:00 +++ b/tools/python/xen/xend/XendDomainInfo.py 2004-10-22 13:01:02 -04:00 @@ -288,6 +288,18 @@ if isinstance(v, defer.Deferred): dlist.append(v) +def dlist_err(val): + """Error callback suitable for a deferred list. + In a deferred list the error callback is called with with Failure((error, index)). + This callback extracts the error and returns it. + + @param val: Failure containing (error, index) + @type val: twisted.internet.failure.Failure + """ + + (error, index) = val.value + return error + class XendDomainInfo: """Virtual machine object.""" @@ -763,6 +775,7 @@ append_deferred(dlist, v) index[dev_name] = dev_index + 1 deferred = defer.DeferredList(dlist, fireOnOneErrback=1) + deferred.addErrback(dlist_err) return deferred def device_create(self, dev_config): @@ -994,6 +1007,7 @@ log.warning("Unknown config field %s", field_name) index[field_name] = field_index + 1 d = defer.DeferredList(dlist, fireOnOneErrback=1) + d.addErrback(dlist_err) return d @@ -1007,7 +1021,7 @@ """ kernel = sxp.child_value(image, "kernel") cmdline = "" - ip = sxp.child_value(image, "ip", "dhcp") + ip = sxp.child_value(image, "ip", None) if ip: cmdline += " ip=" + ip root = sxp.child_value(image, "root") |
From: BitKeeper B. <ri...@su...> - 2004-10-22 17:01:29
|
ChangeSet 1.1408.1.1, 2004/10/21 11:47:34+01:00, xe...@ga... Merge http://xen.bkbits.net:8080/xeno-unstable.bk into gandalf.hpl.hp.com:/var/bk/xeno-unstable.bk 0 files changed |