Message ID | 20240123094317.15958-1-pstanner@redhat.com (mailing list archive) |
---|---|
Headers | show |
Series | Make PCI's devres API more consistent | expand |
Forgot to add a few changes to the changelog: On Tue, 2024-01-23 at 10:42 +0100, Philipp Stanner wrote: > Changes in v2: > - Make commit head lines congruent with PCI's style (Bjorn) > - Add missing error checks for devm_add_action(). (Andy) > - Repair the "Returns: " marks for docu generation (Andy) > - Initialize the addr_devres struct with memset(). (Andy) > - Make pcim_intx() a PCI-internal function so that new drivers > won't > be encouraged to use the outdated pci_intx() mechanism. > (Andy / Philipp) > - Fix grammar and spelling (Bjorn) > - Be more precise on why pcim_iomap_table() is problematic (Bjorn) > - Provide the actual structs' and functions' names in the commit > messages (Bjorn) > - Remove redundant variable initializers (Andy) > - Regroup PM bitfield members in struct pci_dev (Andy) > - Consistently use the term "PCI devres API"; also in Patch #10 > (Bjorn) * Make pcim_intx() visible only for the PCI subsystem so that new drivers won't use this outdated API (Andy, Myself) * Add a NOTE to pcim_iomap() to warn about this function being the onee xception that does just return NULL. This v2 now contains most of the feedback, except the ones Andy and I haven't agreed on yet. Thx, P. > > > ¡Hola! > > PCI's devres API suffers several weaknesses: > > 1. There are functions prefixed with pcim_. Those are always managed > counterparts to never-managed functions prefixed with pci_ – or so > one > would like to think. There are some apparently unmanaged functions > (all region-request / release functions, and pci_intx()) which > suddenly become managed once the user has initialized the device > with > pcim_enable_device() instead of pci_enable_device(). This > "sometimes > yes, sometimes no" nature of those functions is confusing and > therefore bug-provoking. In fact, it has already caused a bug in > DRM. > The last patch in this series fixes that bug. > 2. iomappings: Instead of giving each mapping its own callback, the > existing API uses a statically allocated struct tracking one > mapping > per bar. This is not extensible. Especially, you can't create > _ranged_ managed mappings that way, which many drivers want. > 3. Managed request functions only exist as "plural versions" with a > bit-mask as a parameter. That's quite over-engineered considering > that each user only ever mapps one, maybe two bars. > > This series: > - add a set of new "singular" devres functions that use devres the > way > its intended, with one callback per resource. > - deprecates the existing iomap-table mechanism. > - deprecates the hybrid nature of pci_ functions. > - preserves backwards compatibility so that drivers using the > existing > API won't notice any changes. > - adds documentation, especially some warning users about the > complicated nature of PCI's devres. > > > Note that this series is based on my "unify pci_iounmap"-series from > a > few weeks ago. [1] > > I tested this on a x86 VM with a simple pci test-device with two > regions. Operates and reserves resources as intended on my system. > Kasan and kmemleak didn't find any problems. > > I believe this series cleans the API up as much as possible without > having to port all existing drivers to the new API. Especially, I > think > that this implementation is easy to extend if the need for new > managed > functions arises :) > > Greetings, > P. > > Philipp Stanner (10): > PCI: add new set of devres functions > PCI: deprecate iomap-table functions > PCI: warn users about complicated devres nature > PCI: make devres region requests consistent > PCI: move dev-enabled status bit to struct pci_dev > PCI: move pinned status bit to struct pci_dev > PCI: give pcim_set_mwi() its own devres callback > PCI: give pci(m)_intx its own devres callback > PCI: remove legacy pcim_release() > drm/vboxvideo: fix mapping leaks > > Documentation/driver-api/pci/pci.rst | 3 + > drivers/gpu/drm/vboxvideo/vbox_main.c | 24 +- > drivers/pci/devres.c | 1015 +++++++++++++++++++++-- > -- > drivers/pci/iomap.c | 18 + > drivers/pci/pci.c | 123 ++- > drivers/pci/pci.h | 25 +- > include/linux/pci.h | 18 +- > 7 files changed, 1011 insertions(+), 215 deletions(-) >