diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pci/hotplug/pciehp_pci.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c index aac7a40e4a4a..0e0d0f7f63fd 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c | |||
| @@ -92,7 +92,14 @@ int pciehp_unconfigure_device(struct slot *p_slot) | |||
| 92 | if (ret) | 92 | if (ret) |
| 93 | presence = 0; | 93 | presence = 0; |
| 94 | 94 | ||
| 95 | list_for_each_entry_safe(dev, temp, &parent->devices, bus_list) { | 95 | /* |
| 96 | * Stopping an SR-IOV PF device removes all the associated VFs, | ||
| 97 | * which will update the bus->devices list and confuse the | ||
| 98 | * iterator. Therefore, iterate in reverse so we remove the VFs | ||
| 99 | * first, then the PF. We do the same in pci_stop_bus_device(). | ||
| 100 | */ | ||
| 101 | list_for_each_entry_safe_reverse(dev, temp, &parent->devices, | ||
| 102 | bus_list) { | ||
| 96 | pci_dev_get(dev); | 103 | pci_dev_get(dev); |
| 97 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && presence) { | 104 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && presence) { |
| 98 | pci_read_config_byte(dev, PCI_BRIDGE_CONTROL, &bctl); | 105 | pci_read_config_byte(dev, PCI_BRIDGE_CONTROL, &bctl); |
