[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



Hi Stefano, can you reproduce the issues I meet with? 

Thanks,
-- Dexuan

-----Original Message-----
From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx 
[mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Cui, Dexuan
Sent: 2009?11?4? 16:29
To: Stefano Stabellini; xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: RE: [Xen-devel] [PATCH] xen passthrough: fix recent regressions

BTW, please update or remove the block of comment in xend/server/pciif.py: 
setupDevice().
I think it is out of date after your patchset.

Thanks,
-- Dexuan


-----Original Message-----
From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx 
[mailto:xen-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Cui, Dexuan
Sent: 2009?11?4? 15:42
To: Stefano Stabellini; xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: RE: [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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.