diff options
| author | Jiang Liu <liuj97@gmail.com> | 2012-08-28 11:43:54 -0400 |
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2012-09-12 16:10:33 -0400 |
| commit | ddec11b1452599a006660e160b8a2b707bb0a276 (patch) | |
| tree | 88b0985e2dc7b042b8ca449684aaf136ddd7352b | |
| parent | 0d7614f09c1ebdbaa1599a5aba7593f147bf96ee (diff) | |
ia64/PCI: Use hotplug-safe pci_get_domain_bus_and_slot()
Following code has a race window between pci_find_bus() and pci_get_slot()
if PCI hotplug operation happens between them which removes the pci_bus.
So use PCI hotplug safe interface pci_get_domain_bus_and_slot() instead,
which also reduces code complexity.
struct pci_bus *pci_bus = pci_find_bus(domain, busno);
struct pci_dev *pci_dev = pci_get_slot(pci_bus, devfn);
Signed-off-by: Jiang Liu <jiang.liu@huawei.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
| -rw-r--r-- | arch/ia64/sn/kernel/io_common.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index fbb5f2f87eed..8630875e74b5 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c | |||
| @@ -229,7 +229,6 @@ void sn_pci_fixup_slot(struct pci_dev *dev, struct pcidev_info *pcidev_info, | |||
| 229 | { | 229 | { |
| 230 | int segment = pci_domain_nr(dev->bus); | 230 | int segment = pci_domain_nr(dev->bus); |
| 231 | struct pcibus_bussoft *bs; | 231 | struct pcibus_bussoft *bs; |
| 232 | struct pci_bus *host_pci_bus; | ||
| 233 | struct pci_dev *host_pci_dev; | 232 | struct pci_dev *host_pci_dev; |
| 234 | unsigned int bus_no, devfn; | 233 | unsigned int bus_no, devfn; |
| 235 | 234 | ||
| @@ -245,8 +244,7 @@ void sn_pci_fixup_slot(struct pci_dev *dev, struct pcidev_info *pcidev_info, | |||
| 245 | 244 | ||
| 246 | bus_no = (pcidev_info->pdi_slot_host_handle >> 32) & 0xff; | 245 | bus_no = (pcidev_info->pdi_slot_host_handle >> 32) & 0xff; |
| 247 | devfn = pcidev_info->pdi_slot_host_handle & 0xffffffff; | 246 | devfn = pcidev_info->pdi_slot_host_handle & 0xffffffff; |
| 248 | host_pci_bus = pci_find_bus(segment, bus_no); | 247 | host_pci_dev = pci_get_domain_bus_and_slot(segment, bus_no, devfn); |
| 249 | host_pci_dev = pci_get_slot(host_pci_bus, devfn); | ||
| 250 | 248 | ||
| 251 | pcidev_info->host_pci_dev = host_pci_dev; | 249 | pcidev_info->host_pci_dev = host_pci_dev; |
| 252 | pcidev_info->pdi_linux_pcidev = dev; | 250 | pcidev_info->pdi_linux_pcidev = dev; |
