diff options
Diffstat (limited to 'drivers/pci/hotplug/pciehp_pci.c')
-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); |