Message ID | 20240722151936.1452299-3-kbusch@meta.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Bjorn Helgaas |
Headers | show |
Series | pci: rescan/remove locking rework | expand |
On Mon, 22 Jul 2024 08:19:30 -0700 Keith Busch <kbusch@meta.com> wrote: > From: Keith Busch <kbusch@kernel.org> > > Use an atomic flag instead of the racey check against the device's kobj > parent. We shouldn't be poking into device implementation details at > this level anyway. > > Signed-off-by: Keith Busch <kbusch@kernel.org> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Absolutely agree we shouldn't be poking the kobj parent here.
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 171dfd6f14e6e..19cbf18743a96 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -443,6 +443,7 @@ static inline int pci_dev_set_disconnected(struct pci_dev *dev, void *unused) #define PCI_DEV_ADDED 0 #define PCI_DPC_RECOVERED 1 #define PCI_DPC_RECOVERING 2 +#define PCI_DEV_REMOVED 3 static inline void pci_dev_assign_added(struct pci_dev *dev) { @@ -459,6 +460,11 @@ static inline bool pci_dev_is_added(const struct pci_dev *dev) return test_bit(PCI_DEV_ADDED, &dev->priv_flags); } +static inline bool pci_dev_test_and_set_removed(struct pci_dev *dev) +{ + return test_and_set_bit(PCI_DEV_REMOVED, &dev->priv_flags); +} + #ifdef CONFIG_PCIEAER #include <linux/aer.h> diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index ec3064a115bf8..8284ab20949c9 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -29,7 +29,7 @@ static void pci_stop_dev(struct pci_dev *dev) static void pci_destroy_dev(struct pci_dev *dev) { - if (!dev->dev.kobj.parent) + if (pci_dev_test_and_set_removed(dev)) return; device_del(&dev->dev);