linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Implementation details of PCI Managed (devres) Functions
@ 2023-11-07 19:38 Philipp Stanner
  2023-11-08 17:35 ` Bjorn Helgaas
  2023-11-08 21:02 ` Philipp Stanner
  0 siblings, 2 replies; 7+ messages in thread
From: Philipp Stanner @ 2023-11-07 19:38 UTC (permalink / raw)
  To: linux-pci, linux-kernel
  Cc: Tejun Heo, dakr, Bjorn Helgaas, Andrew Morton, Ben Dooks,
	Philipp Stanner, jeff, Al Viro

Hi all,

I'm currently working on porting more drivers in DRM to managed pci-
functions. During this process I discovered something that might be
called an inconsistency in the implementation.

First, there would be the pcim_ functions being scattered across
several files. Some are implemented in drivers/pci/pci.c, others in
lib/devres.c, where they are guarded by #ifdef CONFIG_PCI
– this originates from an old cleanup, done in
5ea8176994003483a18c8fed580901e2125f8a83

Additionally, there is lib/pci_iomap.c, which contains the non-managed
pci_iomap() functions.

At first and second glance it's not obvious to me why these pci-
functions are scattered. Hints?


Second, it seems there are two competing philosophies behind managed
resource reservations. Some pci_ functions have pcim_ counterparts,
such as pci_iomap() <-> pcim_iomap(). So the API-user might expect that
relevant pci_ functions that do not have a managed counterpart do so
because no one bothered implementing them so far.

However, it turns out that for pci_request_region(), there is no
counterpart because a different mechanism / semantic was used to make
the function _sometimes_ managed:

   1. If you use pcim_enable_device(), the member is_managed in struct
      pci_dev is set to 1.
   2. This value is then evaluated in pci_request_region()'s call to
      find_pci_dr()

Effectively, this makes pci_request_region() sometimes managed.
Why has it been implemented that way and not as a separate function –
like, e.g., pcim_iomap()?

That's where an inconsistency lies. For things like iomappings there
are separate managed functions, for the region-request there's a
universal function doing managed or unmanaged, respectively.

Furthermore, look at pcim_iomap_regions() – that function uses a mix
between the obviously managed function pcim_iomap() and
pci_request_region(), which appears unmanaged judging by the name, but,
nevertheless, is (sometimes) managed below the surface.
Consequently, pcim_iomap_regions() could even be a little buggy: When
someone uses pci_enable_device() + pcim_iomap_regions(), wouldn't that
leak the resource regions?

The change to pci_request_region() hasn't grown historically but was
implemented that way in one run with the first set of managed functions
in commit 9ac7849e35f70. So this implies it has been implemented that
way on purpose.

What was that purpose?

Would be great if someone can give some hints :)

Regards,
P.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-11-10 19:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-11-07 19:38 Implementation details of PCI Managed (devres) Functions Philipp Stanner
2023-11-08 17:35 ` Bjorn Helgaas
2023-11-08 21:11   ` Philipp Stanner
2023-11-08 21:02 ` Philipp Stanner
2023-11-08 23:48   ` Danilo Krummrich
2023-11-09 18:52   ` Tejun Heo
2023-11-10 19:16     ` Philipp Stanner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).