On Wed, Jan 03, 2024 at 02:38:57PM -0800, Dan Williams wrote: > Ira Weiny wrote: > > Users of pci_dev_get() can benefit from a scoped based put. Also, > > locking a PCI device is often done within a single scope. > > > > Define a pci_dev_put() free function and a PCI device lock guard. These > > will initially be used in new CXL event processing code but is defined > > in a separate patch for others to pickup and use/backport easier. > > Any heartburn if I take this through cxl.git with the rest in this > series? Patch 9 has a dependency on this one. No real heartburn. I was trying to figure out what this does since I'm not familiar with the "scoped based put" idea and 'git grep -i "scope.*base"' wasn't much help. I would kind of like the commit log to say a little more about what the "scoped based put" (does that have too many past tenses in it?) means and how users of pci_dev_get() will benefit. I don't know what "locking a PCI device is often done within a single scope" is trying to tell me either. What if it's *not* done within a single scope? Does this change anything for callers of pci_dev_get() and pci_dev_put()? Does this avoid a common programming error? I just don't know what the benefit of this is yet. I'm sure this is really cool stuff, but there's little documentation, few existing users, and I don't know what I need to look for when reviewing things. > > --- a/include/linux/pci.h > > +++ b/include/linux/pci.h > > @@ -1170,6 +1170,7 @@ int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); > > u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp); > > struct pci_dev *pci_dev_get(struct pci_dev *dev); > > void pci_dev_put(struct pci_dev *dev); > > +DEFINE_FREE(pci_dev_put, struct pci_dev *, if (_T) pci_dev_put(_T)) > > void pci_remove_bus(struct pci_bus *b); > > void pci_stop_and_remove_bus_device(struct pci_dev *dev); > > void pci_stop_and_remove_bus_device_locked(struct pci_dev *dev); > > @@ -1871,6 +1872,7 @@ void pci_cfg_access_unlock(struct pci_dev *dev); > > void pci_dev_lock(struct pci_dev *dev); > > int pci_dev_trylock(struct pci_dev *dev); > > void pci_dev_unlock(struct pci_dev *dev); > > +DEFINE_GUARD(pci_dev, struct pci_dev *, pci_dev_lock(_T), pci_dev_unlock(_T)) > > > > /* > > * PCI domain support. Sometimes called PCI segment (eg by ACPI), > > > > -- > > 2.43.0 > > > >