Re: [PATCH v3, part2 17/20] PCI, iommu: use hotplug-safe iteratorsto walk PCI buses

From: Don Dutile
Date: Mon Jun 17 2013 - 16:35:12 EST


On 06/17/2013 04:20 PM, Bjorn Helgaas wrote:
On Sun, May 26, 2013 at 11:53:14PM +0800, Jiang Liu wrote:
Enhance iommu drviers to use hotplug-safe iterators to walk
PCI buses.

Signed-off-by: Jiang Liu<jiang.liu@xxxxxxxxxx>
Cc: Joerg Roedel<joro@xxxxxxxxxx>
Cc: Ingo Molnar<mingo@xxxxxxxxxx>
Cc: Donald Dutile<ddutile@xxxxxxxxxx>
Cc: Hannes Reinecke<hare@xxxxxxx>
Cc: "Li, Zhen-Hua"<zhen-hual@xxxxxx>
Cc: iommu@xxxxxxxxxxxxxxxxxxxxxxxxxx
Cc: linux-kernel@xxxxxxxxxxxxxxx
---
drivers/iommu/amd_iommu.c | 4 +++-
drivers/iommu/dmar.c | 6 ++++--

The AMD and Intel IOMMU drivers are very different, and I would
split this into a patch for each.

+1

2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 21d02b0..eef7a7e 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -352,6 +352,7 @@ static int init_iommu_group(struct device *dev)
struct iommu_dev_data *dev_data;
struct iommu_group *group;
struct pci_dev *dma_pdev;
+ struct pci_bus *b = NULL;
int ret;

group = iommu_group_get(dev);
@@ -388,7 +389,7 @@ static int init_iommu_group(struct device *dev)
* the alias. Be careful to also test the parent device if
* we think the alias is the root of the group.
*/
- bus = pci_find_bus(0, alias>> 8);
+ b = bus = pci_get_bus(0, alias>> 8);
if (!bus)
goto use_group;

@@ -408,6 +409,7 @@ static int init_iommu_group(struct device *dev)
dma_pdev = get_isolation_root(pci_dev_get(to_pci_dev(dev)));
use_pdev:
ret = use_pdev_iommu_group(dma_pdev, dev);
+ pci_bus_put(b);
pci_dev_put(dma_pdev);
return ret;
use_group:
diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index a7967ce..7162787 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -67,12 +67,12 @@ static void __init dmar_register_drhd_unit(struct dmar_drhd_unit *drhd)
static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope,
struct pci_dev **dev, u16 segment)
{
- struct pci_bus *bus;
+ struct pci_bus *b, *bus;
struct pci_dev *pdev = NULL;
struct acpi_dmar_pci_path *path;
int count;

- bus = pci_find_bus(segment, scope->bus);
+ b = bus = pci_get_bus(segment, scope->bus);
path = (struct acpi_dmar_pci_path *)(scope + 1);
count = (scope->length - sizeof(struct acpi_dmar_device_scope))
/ sizeof(struct acpi_dmar_pci_path);
@@ -97,6 +97,8 @@ static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope,
count --;
bus = pdev->subordinate;
}
+ pci_bus_put(b);
+
if (!pdev) {
pr_warn("Device scope device [%04x:%02x:%02x.%02x] not found\n",
segment, scope->bus, path->dev, path->fn);
--
1.8.1.2


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/