Merge branch 'pci/dpc'

- If there's a device below a bridge, prevent a use-after-free by holding a
  reference to the device while waiting for the secondary bus to be ready
  in case the device is concurrently removed, e.g., by DPC (Lukas Wunner)

* pci/dpc:
  PCI/DPC: Fix use-after-free on concurrent DPC and hot-removal
This commit is contained in:
Bjorn Helgaas 2024-07-19 10:10:22 -05:00
commit 147ea50e1e

View File

@ -4823,7 +4823,7 @@ static int pci_bus_max_d3cold_delay(const struct pci_bus *bus)
*/ */
int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type) int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type)
{ {
struct pci_dev *child; struct pci_dev *child __free(pci_dev_put) = NULL;
int delay; int delay;
if (pci_dev_is_disconnected(dev)) if (pci_dev_is_disconnected(dev))
@ -4852,8 +4852,8 @@ int pci_bridge_wait_for_secondary_bus(struct pci_dev *dev, char *reset_type)
return 0; return 0;
} }
child = list_first_entry(&dev->subordinate->devices, struct pci_dev, child = pci_dev_get(list_first_entry(&dev->subordinate->devices,
bus_list); struct pci_dev, bus_list));
up_read(&pci_bus_sem); up_read(&pci_bus_sem);
/* /*