bitkeeper revision 1.940 (40c5a0a5VY_RJcApOo3Gmxz36JQSrQ)
authormwilli2@equilibrium.research.intel-research.net <mwilli2@equilibrium.research.intel-research.net>
Tue, 8 Jun 2004 11:19:01 +0000 (11:19 +0000)
committermwilli2@equilibrium.research.intel-research.net <mwilli2@equilibrium.research.intel-research.net>
Tue, 8 Jun 2004 11:19:01 +0000 (11:19 +0000)
Manual merge.

1  2 
tools/examples/xc_dom_create.py
tools/xend/lib/blkif.py
tools/xend/lib/main.py
tools/xend/lib/manager.py

Simple merge
index a35d1bcea159ad3b79bb9e57a62267e529c1351a,456e3601a0cbfefecf87dfeb412ff35e3a1d0a6b..3dd05a0a95e6c3bd8647eb7ceb831da1fb61e341
@@@ -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
 -        msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0)
 -        msg.append_payload(struct.pack("III",self.dom,0,0))
+         self.create()
+     def create(self):
-                                  { 'domid' : dom, 'blkif_handle' : 0 })
 +        msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0,
++                                 { 'domid' : self.dom, 'blkif_handle' : 0 })
          xend.blkif.pendaddr = xend.main.mgmt_req_addr
          backend_tx_req(msg)
  
          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)
Simple merge
index 3975aa723297da074f94d0ea605950be88ebbda5,25e8e3a1819ee2f8b5a698e9bb4630827d9354ab..49517583b5f42a93c5465c92451b44cc6ce59990
@@@ -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 }