linux-arch.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Catalin Marinas <catalin.marinas@arm.com>
Cc: linux-arch@vger.kernel.org
Subject: Re: [RFC PATCH 2/4] pio-mapping: Add ARM support for the PIO mapping API
Date: Mon, 08 Feb 2010 11:14:34 -0600	[thread overview]
Message-ID: <1265649274.6289.12.camel@mulgrave.site> (raw)
In-Reply-To: <1265645421.4020.119.camel@pc1117.cambridge.arm.com>

On Mon, 2010-02-08 at 16:10 +0000, Catalin Marinas wrote:
> On Fri, 2010-02-05 at 17:36 +0000, James Bottomley wrote:
> > On Fri, 2010-02-05 at 17:20 +0000, Catalin Marinas wrote:
> > > On Fri, 2010-02-05 at 16:43 +0000, James Bottomley wrote:
> > > > On Fri, 2010-02-05 at 16:31 +0000, Catalin Marinas wrote:
> > > > > This patch introduces support for the PIO mapping API on the ARM
> > > > > architecture. It is currently only meant as an example for discussions
> > > > > and it can be further optimised.
> > > [...]
> > > > > diff --git a/arch/arm/include/asm/pio-mapping.h b/arch/arm/include/asm/pio-mapping.h
> > > > > new file mode 100644
> > > > > index 0000000..d7c866a
> > > > > --- /dev/null
> > > > > +++ b/arch/arm/include/asm/pio-mapping.h
> > > [...]
> > > > > +static inline void *pio_map_single(void *addr, size_t size,
> > > > > +                                enum pio_data_direction dir)
> > > > > +{
> > > > > +     return addr;
> > > >
> > > > This API is a bit semantically nasty to use, isn't it?  What we usually
> > > > get in the I/O path is a scatter gather list of pages and offsets (or
> > > > just a page in the network case).
> > > >
> > > > In a highmem kernel, we'd have to kmap the page before it actually had a
> > > > kernel virtual address, so now the use case of the API becomes
> > > >
> > > > vaddr = kmap_...(page)
> > > > pio_map_single(vaddr)
> > > >
> > > > and the reverse on unmap.
> > > >
> > > > Why not just combine the two since we always have to do them anyway and
> > > > do
> > > >
> > > > kmap_pio ... with the various atomic versions?
> > >
> > > For most cases, what we need looks close enough to the kmap semantics
> > > but this wouldn't work for the HCD case - the USB mass storage may use
> > > kmap() but it cannot easily be converted to the kmap_pio API since it's
> > > only the HCD driver that knows what kind of transfer it would do (and
> > > this only gets a (void *) pointer).
> > 
> > OK, so I'm not very familiar with the mechanics of useb, but if it gets
> > a pointer to the kernel virtual address what's wrong with just doing
> > virt_to_page() on that?  Note that virt_to_page() only really works if
> > the page is really a proper offset mapped kernel address, but my little
> > reading in drivers/usb seems to indicate it's a kmalloc buffer.
> 
> I got your point about a kmap-like API which seems to be the case with
> many block device drivers. The USB HCD is a different case where kmap
> isn't used, only a pointer to a buffer that may span across multiple
> pages.
> 
> What about something like below (just copying the code, no patch yet). I
> used the "pio_" prefix rather than "kmap_" prefix since the last two
> functions are used for address ranges rather than page structures for
> cases like HCD.
> 
> The pio_data_direction could be dropped and use the DMA one. We could
> also use pio_kmap_read/pio_kmap_write or similar but we have to triple
> the number of functions, so I prefer the additional argument.

Yes ... I think we don't want to confuse driver writers with two enums
that mean the same thing but have to be used in different places.

> #include <linux/highmem.h>
> 
> enum pio_data_direction {
> 	PIO_BIDIRECTIONAL,
> 	PIO_TO_DEVICE,
> 	PIO_FROM_DEVICE,
> 	PIO_NONE
> };
> 
> #ifdef CONFIG_HAVE_ARCH_PIO
> #include <asm/pio-mapping.h>
> #else
> 
> static inline void *pio_kmap(struct page *page, enum pio_data_direction dir)
> {
> 	return kmap(page);
> }
> 
> static inline void pio_kunmap(struct page *page, enum pio_data_direction dir)
> {
> 	kunmap(page);
> }
> 
> static inline void *pio_kmap_atomic(struct page *page, enum km_type idx,
> 				    enum pio_data_direction dir)
> {
> 	return kmap_atomic(page, idx);
> }
> 
> static inline void pio_kunmap_atomic(void *addr, enum km_type idx,
> 				     enum pio_data_direction dir)
> {
> 	kunmap_atomic(page, idx);
> }

Above are all perfect, thanks for doing this!

Below is where it gets tricky.

This API would have to cope with highmem too ... and because of the
limited mappings available, we can't just map an arbitrary sized buffer
(especially in atomics where the number of available slots is often only
two).

> static inline void *pio_map_range(void *start, size_t size,
> 				  enum pio_data_direction dir)
> {
> 	return start;
> }
> 
> static inline void pio_unmap_range(void *start, size_t size,
> 				   enum pio_data_direction dir)
> {
> }

I think really for range PIO, we need helpers to map and unmap a page at
a time ... sort of like the for_each_sg approach except this time we
loop over the pages in the range mapping and unmapping a single one.

James

  parent reply	other threads:[~2010-02-08 17:14 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-05 16:31 [RFC PATCH 0/4] PIO drivers and cache coherency Catalin Marinas
2010-02-05 16:31 ` [RFC PATCH 1/4] pio-mapping: Add generic support for PIO mapping API Catalin Marinas
2010-02-05 16:31 ` [RFC PATCH 2/4] pio-mapping: Add ARM support for the " Catalin Marinas
2010-02-05 16:43   ` James Bottomley
2010-02-05 17:20     ` Catalin Marinas
2010-02-05 17:36       ` James Bottomley
2010-02-05 18:02         ` Catalin Marinas
2010-02-08 16:10         ` Catalin Marinas
2010-02-08 16:54           ` Russell King
2010-02-08 17:20             ` James Bottomley
2010-02-08 17:33               ` Russell King
2010-02-08 19:07                 ` James Bottomley
2010-02-08 18:02             ` [RFC PATCH 2/4] pio-mapping: Add ARM support for the PIOmapping API Catalin Marinas
2010-02-08 19:09               ` James Bottomley
2010-02-08 17:14           ` James Bottomley [this message]
2010-02-09 18:03             ` [RFC PATCH 2/4] pio-mapping: Add ARM support for the PIO mapping API Catalin Marinas
2010-02-17  9:11               ` Benjamin Herrenschmidt
2010-02-17 20:04                 ` Russell King
2010-02-17 20:39                   ` Benjamin Herrenschmidt
2010-02-05 16:32 ` [RFC PATCH 3/4] pio-mapping: Use the PIO mapping API in libata-sff.c Catalin Marinas
2010-02-05 16:32 ` [RFC PATCH 4/4] pio-mapping: Use the PIO mapping API in the ISP1760 HCD driver Catalin Marinas

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=1265649274.6289.12.camel@mulgrave.site \
    --to=james.bottomley@hansenpartnership.com \
    --cc=catalin.marinas@arm.com \
    --cc=linux-arch@vger.kernel.org \
    /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;
as well as URLs for NNTP newsgroup(s).