PCI: Fix BUG on device attach failure
Previously when pci_bus_add_device() called device_attach() and it returned a negative value, we emitted a WARN but carried on. Commitab1a187bba
("PCI: Check device_attach() return value always"), introduced in Linux 4.6-rc1, changed this to unwind all steps preceding device_attach() and to not set dev->is_added = 1. The latter leads to a BUG if pci_bus_add_device() was called from pci_bus_add_devices(). Fix by not recursing to a child bus if device_attach() failed for the bridge leading to it. This can be triggered by plugging in a PCI device (e.g. Thunderbolt) while the system is asleep. The system locks up when woken because device_attach() returns -EPROBE_DEFER. Fixes:ab1a187bba
("PCI: Check device_attach() return value always") Signed-off-by: Lukas Wunner <lukas@wunner.de> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Родитель
67e658794c
Коммит
1e398eae84
|
@ -324,7 +324,9 @@ void pci_bus_add_devices(const struct pci_bus *bus)
|
|||
}
|
||||
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
BUG_ON(!dev->is_added);
|
||||
/* Skip if device attach failed */
|
||||
if (!dev->is_added)
|
||||
continue;
|
||||
child = dev->subordinate;
|
||||
if (child)
|
||||
pci_bus_add_devices(child);
|
||||
|
|
Загрузка…
Ссылка в новой задаче