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

[PATCH] xen: xen-pciback: Export a bridge and all its children as per TODO



Check if the device is a bridge.
If it is a bridge, iterate over all its child devices and export them.
Log error if the export fails for any particular device logging details.
Export error string is split across lines as I could see several
other such occurrences in the file.
Please let me know if I should change it in some way.

Signed-off-by: Abhinav Jain <jain.abhinav177@xxxxxxxxx>
---
 drivers/xen/xen-pciback/xenbus.c | 39 +++++++++++++++++++++++++-------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c
index b11e401f1b1e..d15271d33ad6 100644
--- a/drivers/xen/xen-pciback/xenbus.c
+++ b/drivers/xen/xen-pciback/xenbus.c
@@ -258,14 +258,37 @@ static int xen_pcibk_export_device(struct 
xen_pcibk_device *pdev,
                xen_register_device_domain_owner(dev, pdev->xdev->otherend_id);
        }
 
-       /* TODO: It'd be nice to export a bridge and have all of its children
-        * get exported with it. This may be best done in xend (which will
-        * have to calculate resource usage anyway) but we probably want to
-        * put something in here to ensure that if a bridge gets given to a
-        * driver domain, that all devices under that bridge are not given
-        * to other driver domains (as he who controls the bridge can disable
-        * it and stop the other devices from working).
-        */
+       /* Check if the device is a bridge and export all its children */
+       if ((dev->hdr_type && PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+               struct pci_dev *child = NULL;
+
+               /* Iterate over all the devices in this bridge */
+               list_for_each_entry(child, &dev->subordinate->devices,
+                               bus_list) {
+                       dev_dbg(&pdev->xdev->dev,
+                               "exporting child device %04x:%02x:%02x.%d\n",
+                               child->domain, child->bus->number,
+                               PCI_SLOT(child->devfn),
+                               PCI_FUNC(child->devfn));
+
+                       err = xen_pcibk_export_device(pdev,
+                                                     child->domain,
+                                                     child->bus->number,
+                                                     PCI_SLOT(child->devfn),
+                                                     PCI_FUNC(child->devfn),
+                                                     devid);
+                       if (err) {
+                               dev_err(&pdev->xdev->dev,
+                                       "failed to export child device : "
+                                       "%04x:%02x:%02x.%d\n",
+                                       child->domain,
+                                       child->bus->number,
+                                       PCI_SLOT(child->devfn),
+                                       PCI_FUNC(child->devfn));
+                               goto out;
+                       }
+               }
+       }
 out:
        return err;
 }
-- 
2.34.1




 


Rackspace

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