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

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

To: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: RE: [Xen-devel] [PATCH] xen passthrough: fix recent regressions
From: "Cui, Dexuan" <dexuan.cui@xxxxxxxxx>
Date: Wed, 4 Nov 2009 15:42:17 +0800
Accept-language: zh-CN, en-US
Acceptlanguage: zh-CN, en-US
Cc:
Delivery-date: Tue, 03 Nov 2009 23:43:12 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <alpine.DEB.2.00.0911031124340.28545@kaball-desktop>
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>
References: <alpine.DEB.2.00.0911031124340.28545@kaball-desktop>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AcpcePBTS7Esw9WoTNWP09C/NeTbfQAnChBg
Thread-topic: [Xen-devel] [PATCH] xen passthrough: fix recent regressions
Hi Stefano,
Your patch has been checked in as changeset 20397: bd60c77071eb with which the 
issues I mentioned disappear.
However, 2  new issues arise (for ioemu, I'm using the latest 
3140780e451d3919ef2c81f91ae0ebe3f286eb06; I only tried the non-stubdomain case):

1) After assigning 2 devices to an hvm guest,
# xm pci-list my_domain_id
VSlt VFn domain bus  slot func
0x05 0x0 0x0000 0x01 0x00 0x0
-    -   0x0000 0x07 0x00 0x0         ===> the VSlt and VFn don't show properly.


2) 
# xm pci-attach my_domain_id 01:00.0
# xm pci-attach my_domain_id 07:00.0
# xm pci-list my_domain_id
VSlt VFn domain bus  slot func
0x04 0x0 0x0000 0x01 0x00 0x0
0x05 0x0 0x0000 0x07 0x00 0x0
# xm pci-detach my_domain_id 01:00.0
# xm pci-detach my_domain_id 07:00.0
Error: Failed to deassign device from IOMMU (0000:07:00.0)

Can you try the 2 cases?

BTW, in xend/XendDomainInfo.py:  device_configure() ->  pci_device_configure(), 
the usage of 'first_dev' is suspicious, e.g., after we create hvm guest without 
any device assigned, we can try to 'xm pci-attach' a device to the guest -- at 
this time, 'first_dev' is False in pci_device_configure. I guess it's not ok.

Thanks,
-- Dexuan

-----Original Message-----
From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx 
[mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Stefano Stabellini
Sent: 2009?11?3? 19:31
To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] xen passthrough: fix recent regressions

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

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