WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] xen passthrough: fix recent regressions

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] xen passthrough: fix recent regressions
From: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
Date: Tue, 3 Nov 2009 11:30:38 +0000
Delivery-date: Tue, 03 Nov 2009 03:29:22 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Alpine 2.00 (DEB 1167 2008-08-23)
Hi all,
this patch fixes the recent regressions pointed out by Dexuan, keeping
pci passthrough working with stubdom too.
In particular calling device_create when pci_state == 'Initialising' is
a mistake because the state is always Initialising when attaching a
devicem while device_create has too be called only when the pci backend
is missing.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

---


diff -r 47136dbb972d tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Oct 28 10:59:55 2009 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py   Tue Nov 03 11:06:16 2009 +0000
@@ -597,6 +597,7 @@
             return
 
         devid = '0'
+        first = True
         dev_info = self._getDeviceInfo_pci(devid)
         if dev_info is None:
             return
@@ -619,7 +620,8 @@
             head_dev = dev.pop()
             dev_sxp = pci_convert_dict_to_sxp(head_dev, 'Initialising',
                                               'Booting')
-            self.pci_device_configure(dev_sxp)
+            self.pci_device_configure(dev_sxp, first_dev = first)
+            first = False
 
             # That is all for single-function virtual devices
             if len(dev) == 0:
@@ -829,7 +831,7 @@
         return self.getDeviceController(dev_type).sxpr(devid)
 
 
-    def pci_device_configure(self, dev_sxp, devid = 0):
+    def pci_device_configure(self, dev_sxp, devid = 0, first_dev = False):
         """Configure an existing pci device.
         
         @param dev_sxp: device configuration
@@ -859,13 +861,13 @@
         dev = dev_config['devs'][0]
 
         stubdomid = self.getStubdomDomid()
-        if stubdomid is not None :
-            from xen.xend import XendDomain
-            
XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
-
         # Do HVM specific processing
         if self.info.is_hvm():
+            from xen.xend import XendDomain
             if pci_state == 'Initialising':
+                if stubdomid is not None :
+                    
XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
+
                 # HVM PCI device attachment
                 if pci_sub_state == 'Booting':
                     vdevfn = self.hvm_pci_device_insert(dev_config)
@@ -896,6 +898,8 @@
                 # same vslot.
                 if (PCI_FUNC(int(new_dev['vdevfn'], 16)) == 0):
                     self.hvm_destroyPCIDevice(new_dev)
+                if stubdomid is not None :
+                    
XendDomain.instance().domain_lookup(stubdomid).pci_device_configure(dev_sxp[:])
                 # Update vdevfn
                 dev['vdevfn'] = new_dev['vdevfn']
                 for n in sxp.children(pci_dev):
@@ -908,15 +912,22 @@
                 self.pci_device_check_attachability(dev)
 
         # If pci platform does not exist, create and exit.
-        if pci_state == 'Initialising' :
+        if existing_dev_info is None :
             self.device_create(dev_sxp)
+            return True
+
+        if first_dev is True :
+            existing_dev_uuid = sxp.child_value(existing_dev_info, 'uuid')
+            existing_pci_conf = self.info['devices'][existing_dev_uuid][1]
+            devid = self._createDevice('pci', existing_pci_conf)
+            self.info['devices'][existing_dev_uuid][1]['devid'] = devid
             return True
 
         if self.domid is not None:
             # use DevController.reconfigureDevice to change device config
             dev_control = self.getDeviceController(dev_class)
             dev_uuid = dev_control.reconfigureDevice(devid, dev_config)
-            if not self.info.is_hvm():
+            if not self.info.is_hvm() and not self.info.is_stubdom():
                 # in PV case, wait until backend state becomes connected.
                 dev_control.waitForDevice_reconfigure(devid)
             num_devs = dev_control.cleanupDevice(devid)

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel