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

[Xen-devel] [PATCH] xen PV passthru: assign SR-IOV virtual functions to separate virtual slots



VFs are reported as single-function devices in PCI_HEADER_TYPE, which
causes pci_scan_slot() in the PV domU to skip all VFs beyond #0 in the
pciback-provided slot. Avoid this by assigning each VF to a separate
virtual slot.

Signed-off-by: Laszlo Ersek <lersek@xxxxxxxxxx>
---
 drivers/xen/xen-pciback/vpci.c |   35 ++++++++++++++++++++---------------
 1 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/drivers/xen/xen-pciback/vpci.c b/drivers/xen/xen-pciback/vpci.c
index 46d140b..489404a 100644
--- a/drivers/xen/xen-pciback/vpci.c
+++ b/drivers/xen/xen-pciback/vpci.c
@@ -89,21 +89,26 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device 
*pdev,
 
        mutex_lock(&vpci_dev->lock);
 
-       /* Keep multi-function devices together on the virtual PCI bus */
-       for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-               if (!list_empty(&vpci_dev->dev_list[slot])) {
-                       t = list_entry(list_first(&vpci_dev->dev_list[slot]),
-                                      struct pci_dev_entry, list);
-
-                       if (match_slot(dev, t->dev)) {
-                               pr_info(DRV_NAME ": vpci: %s: "
-                                       "assign to virtual slot %d func %d\n",
-                                       pci_name(dev), slot,
-                                       PCI_FUNC(dev->devfn));
-                               list_add_tail(&dev_entry->list,
-                                             &vpci_dev->dev_list[slot]);
-                               func = PCI_FUNC(dev->devfn);
-                               goto unlock;
+       /*
+        * Keep multi-function devices together on the virtual PCI bus, except
+        * virtual functions.
+        */
+       if (!dev->is_virtfn) {
+               for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
+                       if (!list_empty(&vpci_dev->dev_list[slot])) {
+                               t = 
list_entry(list_first(&vpci_dev->dev_list[slot]),
+                                              struct pci_dev_entry, list);
+
+                               if (match_slot(dev, t->dev)) {
+                                       pr_info(DRV_NAME ": vpci: %s: "
+                                               "assign to virtual slot %d func 
%d\n",
+                                               pci_name(dev), slot,
+                                               PCI_FUNC(dev->devfn));
+                                       list_add_tail(&dev_entry->list,
+                                                     
&vpci_dev->dev_list[slot]);
+                                       func = PCI_FUNC(dev->devfn);
+                                       goto unlock;
+                               }
                        }
                }
        }
-- 
1.7.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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