powerpc/eeh: avoid possible crash when edev->pdev changes
If a PCI device is removed during eeh_pe_report_edev(), edev->pdev will change and can cause a crash, hold the PCI rescan/remove lock while taking a copy of edev->pdev->bus. Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20240617140240.580453-1-ganeshgr@linux.ibm.com
This commit is contained in:
parent
1a14150e16
commit
a1216e62d0
@ -849,6 +849,7 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
|
|||||||
{
|
{
|
||||||
struct eeh_dev *edev;
|
struct eeh_dev *edev;
|
||||||
struct pci_dev *pdev;
|
struct pci_dev *pdev;
|
||||||
|
struct pci_bus *bus = NULL;
|
||||||
|
|
||||||
if (pe->type & EEH_PE_PHB)
|
if (pe->type & EEH_PE_PHB)
|
||||||
return pe->phb->bus;
|
return pe->phb->bus;
|
||||||
@ -859,9 +860,11 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
|
|||||||
|
|
||||||
/* Retrieve the parent PCI bus of first (top) PCI device */
|
/* Retrieve the parent PCI bus of first (top) PCI device */
|
||||||
edev = list_first_entry_or_null(&pe->edevs, struct eeh_dev, entry);
|
edev = list_first_entry_or_null(&pe->edevs, struct eeh_dev, entry);
|
||||||
|
pci_lock_rescan_remove();
|
||||||
pdev = eeh_dev_to_pci_dev(edev);
|
pdev = eeh_dev_to_pci_dev(edev);
|
||||||
if (pdev)
|
if (pdev)
|
||||||
return pdev->bus;
|
bus = pdev->bus;
|
||||||
|
pci_unlock_rescan_remove();
|
||||||
|
|
||||||
return NULL;
|
return bus;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user