From: mwilli2@equilibrium.research.intel-research.net Date: Tue, 8 Jun 2004 11:19:01 +0000 (+0000) Subject: bitkeeper revision 1.940 (40c5a0a5VY_RJcApOo3Gmxz36JQSrQ) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~18181 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=119951c48af41c7b0f0073fd0c3c6a6f551caa89;p=xen.git bitkeeper revision 1.940 (40c5a0a5VY_RJcApOo3Gmxz36JQSrQ) Manual merge. --- 119951c48af41c7b0f0073fd0c3c6a6f551caa89 diff --cc tools/xend/lib/blkif.py index a35d1bcea1,456e3601a0..3dd05a0a95 --- a/tools/xend/lib/blkif.py +++ b/tools/xend/lib/blkif.py @@@ -43,33 -72,38 +72,48 @@@ def backend_rx_rsp(port, msg) rsp = { 'success': True } xend.main.send_management_response(rsp, xend.blkif.pendaddr) elif subtype == CMSG_BLKIF_BE_CONNECT: - (dom,hnd,evtchn,frame,st) = struct.unpack("IIILI", msg.get_payload()) + pl = msg.get_payload() + (dom, hnd, frame, evtchn, st) = (pl['domid'], pl['blkif_handle'], + pl['shmem_frame'], pl['evtchn'], + pl['status']) blkif = interface.list[xend.main.port_from_dom(dom).local_port] - msg = xend.utils.message(CMSG_BLKIF_FE, \ - CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0) - msg.append_payload(struct.pack("III",0,2,blkif.evtchn['port2'])) + msg = xend.utils.message(CMSG_BLKIF_FE, + CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0, + { 'handle' : 0, 'status' : 2, + 'evtchn' : blkif.evtchn['port2'] }) blkif.ctrlif_tx_req(xend.main.port_list[blkif.key], msg) elif subtype == CMSG_BLKIF_BE_VBD_CREATE: - (dom,hnd,vdev,ro,st) = struct.unpack("IIHII", msg.get_payload()) + pl = msg.get_payload() + (dom, hnd, vdev, ro, st) = (pl['domid'], pl['blkif_handle'], + pl['vdevice'], pl['readonly'], + pl['status']) blkif = interface.list[xend.main.port_from_dom(dom).local_port] (pdev, start_sect, nr_sect, readonly) = blkif.devices[vdev] - msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0) - msg.append_payload(struct.pack("IIHHHQQI",dom,0,vdev,0, \ - pdev,start_sect,nr_sect,0)) + msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0, + { 'domid' : dom, 'blkif_handle' : 0, + 'vdevice' : vdev, + 'extent.sector_start' : start_sect, + 'extent.sector_length' : nr_sect, + 'extent.device' : pdev }) backend_tx_req(msg) elif subtype == CMSG_BLKIF_BE_VBD_GROW: - rsp = { 'success': True } - xend.main.send_management_response(rsp, xend.blkif.pendaddr) + if not xend.blkif.recovery: + rsp = { 'success': True } + xend.main.send_management_response(rsp, xend.blkif.pendaddr) + else: + interface.rebuilt_so_far += 1 + if interface.rebuilt_so_far == interface.nr_to_rebuild: + print "Rebuilt VBDs, notifying guests:" + for blkif_key in interface.list.keys(): + blkif = interface.list[blkif_key] + print " Notifying %d" % blkif.dom + msg = xend.utils.message(CMSG_BLKIF_FE, \ + CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0) + msg.append_payload(struct.pack("III", 0,1,0)) + blkif.ctrlif_tx_req(xend.main.port_from_dom(blkif.dom),msg) + xend.blkif.recovery = False + print "Done notifying guests" + def backend_do_work(port): global pendmsg @@@ -93,8 -126,11 +136,11 @@@ class interface self.devices = {} self.pendmsg = None interface.list[key] = self + self.create() + + def create(self): - msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0) - msg.append_payload(struct.pack("III",self.dom,0,0)) + msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0, - { 'domid' : dom, 'blkif_handle' : 0 }) ++ { 'domid' : self.dom, 'blkif_handle' : 0 }) xend.blkif.pendaddr = xend.main.mgmt_req_addr backend_tx_req(msg) @@@ -139,19 -180,20 +191,21 @@@ port.write_response(msg) subtype = (msg.get_header())['subtype'] if subtype == CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED: - print "BLKIF: Domain %d says hello" % port.remote_dom - msg = xend.utils.message(CMSG_BLKIF_FE, \ - CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0) - msg.append_payload(struct.pack("III",0,1,0)) + msg = xend.utils.message(CMSG_BLKIF_FE, + CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, + 0, + { 'handle' : 0, 'status' : 1 }) self.ctrlif_tx_req(port, msg) elif subtype == CMSG_BLKIF_FE_INTERFACE_CONNECT: - print "BLKIF: Domain %d wants to connect" % port.remote_dom - (hnd,frame) = struct.unpack("IL", msg.get_payload()) + pl = msg.get_payload() + (hnd, frame) = (pl['handle'], pl['shmem_frame']) xc = Xc.new() - self.evtchn = xc.evtchn_bind_interdomain(dom1=0,dom2=self.dom) + self.evtchn = xc.evtchn_bind_interdomain( \ + dom1=xend.blkif.be_port.remote_dom, \ + dom2=self.dom) - msg = xend.utils.message(CMSG_BLKIF_BE, \ - CMSG_BLKIF_BE_CONNECT, 0) - msg.append_payload(struct.pack("IIILI",self.dom,0, \ - self.evtchn['port1'],frame,0)) + msg = xend.utils.message(CMSG_BLKIF_BE, + CMSG_BLKIF_BE_CONNECT, 0, + { 'domid' : self.dom, 'blkif_handle' : 0, + 'shmem_frame' : frame, + 'evtchn' : self.evtchn['port1'] }) backend_tx_req(msg) diff --cc tools/xend/lib/manager.py index 3975aa7232,25e8e3a181..49517583b5 --- a/tools/xend/lib/manager.py +++ b/tools/xend/lib/manager.py @@@ -158,7 -158,16 +158,17 @@@ def new_network_interface(dom, handle=- ## for the network will only be accepted from this domain. ## def set_network_backend(dom): - if xend.netif.be_port: xend.netif.recovery = True + if xend.netif.be_port.remote_dom != 0: + xend.netif.recovery = True xend.netif.be_port = xend.main.port_from_dom(dom) return { 'success' : True } + + ## + ## set_block_backend + ## Authorise a domain to act as the block backend (assumes we only have one + ## backend driver for now). After this call, back end "up" notifications + ## for the network will only be accepted from this domain. + def set_block_backend(dom): + if xend.blkif.be_port: xend.blkif.recovery = True + xend.blkif.be_port = xend.main.port_from_dom(dom) + return { 'success' : True }