[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240609184410.53500-1-jain.abhinav177@gmail.com>
Date: Sun, 9 Jun 2024 18:44:10 +0000
From: Abhinav Jain <jain.abhinav177@...il.com>
To: jgross@...e.com,
sstabellini@...nel.org,
oleksandr_tyshchenko@...m.com,
xen-devel@...ts.xenproject.org,
linux-kernel@...r.kernel.org
Cc: skhan@...uxfoundation.org,
javier.carrasco.cruz@...il.com,
jain.abhinav177@...il.com
Subject: [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@...il.com>
---
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
Powered by blists - more mailing lists