Linux PCI subsystem development
 help / color / mirror / Atom feed
From: "Arnd Bergmann" <arnd@kernel.org>
To: "Philipp Stanner" <pstanner@redhat.com>,
	"Danilo Krummrich" <dakr@redhat.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Randy Dunlap" <rdunlap@infradead.org>,
	"Jason Gunthorpe" <jgg@ziepe.ca>,
	"Eric Auger" <eric.auger@redhat.com>,
	"Kent Overstreet" <kent.overstreet@gmail.com>,
	"Niklas Schnelle" <schnelle@linux.ibm.com>,
	"Neil Brown" <neilb@suse.de>, "John Sanpe" <sanpeqf@gmail.com>,
	"Dave Jiang" <dave.jiang@intel.com>,
	"Yury Norov" <yury.norov@gmail.com>,
	"Kees Cook" <keescook@chromium.org>,
	"Masami Hiramatsu" <mhiramat@kernel.org>,
	"David Gow" <davidgow@google.com>,
	"Herbert Xu" <herbert@gondor.apana.org.au>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"wuqiang.matt" <wuqiang.matt@bytedance.com>,
	"Jason Baron" <jbaron@akamai.com>,
	"Ben Dooks" <ben.dooks@codethink.co.uk>
Cc: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org
Subject: Re: [PATCH 4/4] lib/iomap.c: improve comment about pci anomaly
Date: Wed, 29 Nov 2023 18:37:25 +0100	[thread overview]
Message-ID: <8c45a36e-60f9-49ee-aa77-aaba8ac5e62f@app.fastmail.com> (raw)
In-Reply-To: <b13191e7a5ad63de23adb8ec3f8a3699a0dd236e.camel@redhat.com>

On Wed, Nov 29, 2023, at 11:16, Philipp Stanner wrote:
> On Fri, 2023-11-24 at 20:08 +0100, Danilo Krummrich wrote:
>>
>> lib/pci_iomap.c contains another definition of pci_iounmap() which is
>> guarded by ARCH_WANTS_GENERIC_PCI_IOUNMAP to prevent multiple
>> definitions
>> in case either GENERIC_IOMAP is set or the architecture already
>> defined
>> pci_iounmap().
>
> To clarify that, here's the relevant excerpt from include/asm-
> generic/io.h:
>
> #ifndef CONFIG_GENERIC_IOMAP
> #ifndef pci_iounmap
> #define ARCH_WANTS_GENERIC_PCI_IOUNMAP
> #endif
> #endif

Right, this was added fairly recently in an effort to
unify the architectures that can share a simple implementation
based on the way that modern PCI host bridges on non-x86
work.

>> What's the purpose of not having set ARCH_HAS_GENERIC_IOPORT_MAP
>> producing
>> an empty definition of pci_iounmap() though [1]?
>> 
>> And more generally, is there any other (subtle) logic behind this?
>
> That's indeed also very hard to understand for me, because you'd expect
> that if pci_iomap() exists (and does something), pci_iounmap() should
> also exist and, of course, unmapp the memory again.

Right, I think that was a leak introduced in 316e8d79a095
("pci_iounmap'2: Electric Boogaloo: try to make sense of
it all") that should be fixed like

--- a/lib/pci_iomap.c
+++ b/lib/pci_iomap.c
@@ -170,8 +170,8 @@ void pci_iounmap(struct pci_dev *dev, void __iomem *p)
 
        if (addr >= start && addr < start + IO_SPACE_LIMIT)
                return;
-       iounmap(p);
 #endif
+       iounmap(p);
 }
 EXPORT_SYMBOL(pci_iounmap);

i.e. architectures without port I/O just call iounmap() but those
that support the normal ioport_map() have to skip iounmap()
for ports in that special PIO range.

> Regarding the last point, a number of architectures define their own
> ioport_map():
>
> arch/alpha/kernel/io.c, line 684 (as a function)
> arch/arc/include/asm/io.h, line 27 (as a function)
> arch/arm/mm/iomap.c, line 19 (as a function)
> arch/m68k/include/asm/kmap.h, line 60 (as a function)
> arch/parisc/lib/iomap.c, line 504 (as a function)
> arch/powerpc/kernel/iomap.c, line 14 (as a function)
> arch/s390/include/asm/io.h, line 38 (as a function)
> arch/sh/kernel/ioport.c, line 24 (as a function)
> arch/sparc/lib/iomap.c, line 10 (as a function)
>
> I grepped through those archs and as I see it, none of those specify an
> empty pci_iomap() that could be a counterpart to the potentially empty
> pci_iounmap() in lib/pci_iomap.c

I'm trying to unwind what you are saying here, and there are
two separate issues:

- an empty unmap() function still makes sense if the map() function
  just returns a usable pointer like the asm-generic version
  of ioport_map(), it only has to be non-empty if the map function
  allocates a resource that has to be freed later, like the
  page table entries for most ioremap() implementations.

- pci_iounmap() in lib/pci_iomap.c being empty is probably
  just a bug

>> From what I can tell looking at the header, I think we can
>> just remove the "#elif defined(CONFIG_GENERIC_PCI_IOMAP)"
>> bit entirely, as it no longer serves the purpose it originally
>> had.
>
> So it seems that the empty unmap-function in pci_iomap.c is the left-
> over counterpart of those mapping functions always returning NULL.

no

> @Arnd:
> Your code draft
>
> void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
> {
> #ifdef CONFIG_HAS_IOPORT
> if (iomem_is_ioport(addr)) {
> ioport_unmap(addr);
> return;
> }
> #endif
> iounmap(addr)
> }
>
> seems to agree with that: There will never be the need for an empty
> function that does nothing. Correct?

Agreed, while arch/sparc/ currently has an empty pci_iounmap(),
that is just because the normal iounmap() on that architecture
is also empty, given that all MMIO memory is always mapped.

>> > {
>> > #ifdef CONFIG_HAS_IOPORT
>> >         if (iomem_is_ioport(addr)) {
>> >                ioport_unmap(addr);
>> >                return;
>> >         }
>> > #endif
>> >        iounmap(addr)
>> > }
>> > 
>> > and then define iomem_is_ioport() in lib/iomap.c for x86,
>> > while defining it in asm-generic/io.h for the rest,
>> > with an override in asm/io.h for those architectures
>> > that need a custom inb().
>> 
>> So, that would be similar to IO_COND(), right? What would we need
>> inb() for in this context?

In general, any architecture that has a custom inb() also
needs a custom ioport_map() and iomem_is_ioport() in this
scheme, while the "normal" architectures like arm/arm64 and
riscv should be able to just use the asm-generic version.

IO_COND() is really specific to those architectures that
rely on the rather misnamed GENERIC_IOMAP for implementing
ioport_map().

     Arnd

  reply	other threads:[~2023-11-29 17:37 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-20 21:59 [PATCH 0/4] Regather scattered PCI-Code Philipp Stanner
2023-11-20 21:59 ` [PATCH 1/4] lib: move pci_iomap.c to drivers/pci/ Philipp Stanner
2023-11-21  4:20   ` kernel test robot
2023-11-21 10:44     ` Philipp Stanner
2023-11-21  6:48   ` kernel test robot
2023-11-21  7:22     ` Arnd Bergmann
2023-11-21  7:20   ` kernel test robot
2023-11-21  7:45   ` kernel test robot
2023-11-21  7:58   ` kernel test robot
2023-11-21  8:46   ` kernel test robot
2023-11-21 10:44   ` kernel test robot
2023-11-21 10:44   ` kernel test robot
2023-11-21 13:14   ` kernel test robot
2023-11-21 14:38   ` kernel test robot
2023-11-21 15:04   ` kernel test robot
2023-11-21 15:40   ` kernel test robot
2023-11-21 15:56   ` kernel test robot
2023-11-22  1:51     ` Liu, Yujie
2023-11-22  8:15       ` Philipp Stanner
2023-11-23  6:42         ` Yujie Liu
2023-11-22 16:28   ` kernel test robot
2023-11-20 21:59 ` [PATCH 2/4] lib: move pci-specific devres code " Philipp Stanner
2023-11-21  7:29   ` Arnd Bergmann
2023-11-21  8:00     ` Philipp Stanner
2023-11-21 10:10       ` Arnd Bergmann
2023-11-20 21:59 ` [PATCH 3/4] pci: move devres code from pci.c to devres.c Philipp Stanner
2023-11-21 10:17   ` Arnd Bergmann
2023-11-21 10:36     ` Philipp Stanner
2023-11-20 21:59 ` [PATCH 4/4] lib/iomap.c: improve comment about pci anomaly Philipp Stanner
2023-11-21 10:03   ` Arnd Bergmann
2023-11-21 14:38     ` Philipp Stanner
2023-11-21 14:41       ` Arnd Bergmann
2023-11-24 19:08     ` Danilo Krummrich
2023-11-29 10:16       ` Philipp Stanner
2023-11-29 17:37         ` Arnd Bergmann [this message]
2023-11-29 12:40     ` Philipp Stanner
2023-11-29 16:52       ` Arnd Bergmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8c45a36e-60f9-49ee-aa77-aaba8ac5e62f@app.fastmail.com \
    --to=arnd@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=ben.dooks@codethink.co.uk \
    --cc=bhelgaas@google.com \
    --cc=dakr@redhat.com \
    --cc=dave.jiang@intel.com \
    --cc=davidgow@google.com \
    --cc=eric.auger@redhat.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jbaron@akamai.com \
    --cc=jgg@ziepe.ca \
    --cc=keescook@chromium.org \
    --cc=kent.overstreet@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=neilb@suse.de \
    --cc=pstanner@redhat.com \
    --cc=rdunlap@infradead.org \
    --cc=sanpeqf@gmail.com \
    --cc=schnelle@linux.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=wuqiang.matt@bytedance.com \
    --cc=yury.norov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox