From: Russell King <rmk@arm.linux.org.uk>
To: James Bottomley <James.Bottomley@suse.de>
Cc: Parisc List <linux-parisc@vger.kernel.org>,
Linux Filesystem Mailing List <linux-fsdevel@vger.kernel.org>,
linux-arch@vger.kernel.org, Christoph Hellwig <hch@lst.de>
Subject: Re: xfs failure on parisc (and presumably other VI cache systems) caused by I/O to vmalloc/vmap areas
Date: Tue, 8 Sep 2009 20:00:31 +0100 [thread overview]
Message-ID: <20090908190031.GF6538@flint.arm.linux.org.uk> (raw)
In-Reply-To: <1252434469.13003.3.camel@mulgrave.site>
On Tue, Sep 08, 2009 at 01:27:49PM -0500, James Bottomley wrote:
> This bug was observed on parisc, but I would expect it to affect all
> architectures with virtually indexed caches.
I don't think your proposed solution will work for ARM with speculative
prefetching (iow, the latest ARM CPUs.) If there is a mapping present,
it can be speculatively prefetched from at any time - the CPU designers
have placed no bounds on the amount of speculative prefetching which
may be present in a design.
What this means that for DMA, we will need to handle cache coherency
issues both before and after DMA.
If we're going to allow non-direct mapped (offset mapped in your parlence)
block IO, it makes it impossible to handle cache coherency after DMA
completion - although we can translate (via page table walks) from a
virtual address to a physical, and then to a bus address for DMA, going
back the other way is impossible since there could be many right answers.
What has been annoying me for a while about the current DMA API is that
drivers have to carry around all sorts of information for a DMA mapping,
whether the architecture needs it or not - and sometimes that information
is not what the architecture wants. To this end, I've been thinking that
something more like:
struct dma_mapping map;
err = dma2_map_single(&map, buffer, size, direction);
if (err)
...
addr = dma2_addr(&map);
/* program controller */
/* completion */
dma2_unmap_single(&map);
with similar style interfaces for pages and so forth (scatterlists are
already arch-defined.) Architectures define the contents of
struct dma_mapping - but it must contain at least the dma address.
What's the advantage of this? It means that if an architecture needs to
handle cache issues after DMA on unmap via a virtual address, it can
ensure that the correct address is passed through all the way to the
unmap function. This approach also relieves the driver writer from
having to carry around the direction, size and dma address themselves,
which means we don't need the DMA debug infrastructure to check that
drivers are doing these things correctly.
I seriously doubt, though, that we can revise the DMA API...
In your (and my) case, maybe struct scatterlist also needs to contain
the virtual address as well as the struct page, offset and length?
PS, ARM already does not allow anything but direct-mapped RAM addresses
for dma_map_single(), since we need to be able to translate virtual
addresses to physical for non-coherent L2 cache handling - L1 cache
needs handling via the virtual address and L2 via the physical address.
PPS, you're not the only architecture which has problems with XFS. ARM
has a long standing issue with it too.
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of:
next prev parent reply other threads:[~2009-09-08 19:00 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-08 18:27 xfs failure on parisc (and presumably other VI cache systems) caused by I/O to vmalloc/vmap areas James Bottomley
2009-09-08 19:00 ` Russell King [this message]
2009-09-08 19:11 ` James Bottomley
2009-09-08 20:16 ` Russell King
2009-09-08 20:39 ` James Bottomley
2009-09-08 21:39 ` Russell King
2009-09-09 3:14 ` James Bottomley
2009-09-09 3:17 ` [PATCH 1/5] mm: add coherence API for DMA " James Bottomley
2009-09-09 3:23 ` James Bottomley
2009-09-09 3:35 ` Paul Mundt
2009-09-09 14:34 ` James Bottomley
2009-09-10 0:24 ` Paul Mundt
2009-09-10 0:30 ` James Bottomley
2009-09-09 3:18 ` [PATCH 2/5] parisc: add mm " James Bottomley
2009-09-09 3:20 ` [PATCH 3/5] arm: " James Bottomley
2009-09-09 3:21 ` [PATCH 4/5] block: permit I/O to vmalloc/vmap kernel pages James Bottomley
2009-09-09 3:21 ` [PATCH 5/5] xfs: fix xfs to work with Virtually Indexed architectures James Bottomley
2009-10-13 1:40 ` xfs failure on parisc (and presumably other VI cache systems) caused by I/O to vmalloc/vmap areas Christoph Hellwig
2009-10-13 4:13 ` James Bottomley
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=20090908190031.GF6538@flint.arm.linux.org.uk \
--to=rmk@arm.linux.org.uk \
--cc=James.Bottomley@suse.de \
--cc=hch@lst.de \
--cc=linux-arch@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-parisc@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).