Skip to content

Commit e3f30d5

Browse files
keithbuschbjorn-helgaas
authored andcommitted
PCI: Make pci_destroy_dev() concurrent safe
Use an atomic flag instead of the racy check against the device's kobj parent. We shouldn't be poking into device implementation details at this level anyway. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Keith Busch <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]> Reviewed-by: Jonathan Cameron <[email protected]>
1 parent 93093ea commit e3f30d5

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

drivers/pci/pci.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ static inline int pci_dev_set_disconnected(struct pci_dev *dev, void *unused)
469469
#define PCI_DEV_ADDED 0
470470
#define PCI_DPC_RECOVERED 1
471471
#define PCI_DPC_RECOVERING 2
472+
#define PCI_DEV_REMOVED 3
472473

473474
static inline void pci_dev_assign_added(struct pci_dev *dev)
474475
{
@@ -487,6 +488,11 @@ static inline bool pci_dev_is_added(const struct pci_dev *dev)
487488
return test_bit(PCI_DEV_ADDED, &dev->priv_flags);
488489
}
489490

491+
static inline bool pci_dev_test_and_set_removed(struct pci_dev *dev)
492+
{
493+
return test_and_set_bit(PCI_DEV_REMOVED, &dev->priv_flags);
494+
}
495+
490496
#ifdef CONFIG_PCIEAER
491497
#include <linux/aer.h>
492498

drivers/pci/remove.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static void pci_stop_dev(struct pci_dev *dev)
4646

4747
static void pci_destroy_dev(struct pci_dev *dev)
4848
{
49-
if (!dev->dev.kobj.parent)
49+
if (pci_dev_test_and_set_removed(dev))
5050
return;
5151

5252
pci_npem_remove(dev);

0 commit comments

Comments
 (0)