|
@@ -92,7 +92,14 @@ int pciehp_unconfigure_device(struct slot *p_slot)
|
|
|
if (ret)
|
|
|
presence = 0;
|
|
|
|
|
|
- list_for_each_entry_safe(dev, temp, &parent->devices, bus_list) {
|
|
|
+ /*
|
|
|
+ * Stopping an SR-IOV PF device removes all the associated VFs,
|
|
|
+ * which will update the bus->devices list and confuse the
|
|
|
+ * iterator. Therefore, iterate in reverse so we remove the VFs
|
|
|
+ * first, then the PF. We do the same in pci_stop_bus_device().
|
|
|
+ */
|
|
|
+ list_for_each_entry_safe_reverse(dev, temp, &parent->devices,
|
|
|
+ bus_list) {
|
|
|
pci_dev_get(dev);
|
|
|
if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && presence) {
|
|
|
pci_read_config_byte(dev, PCI_BRIDGE_CONTROL, &bctl);
|