From: linux@arm.linux.org.uk (Russell King - ARM Linux)
To: linux-arm-kernel@lists.infradead.org
Subject: Hit BUG_ON in dma-mapping.c:425 (RFC)
Date: Thu, 24 Mar 2011 09:27:32 +0000 [thread overview]
Message-ID: <20110324092732.GA19935@n2100.arm.linux.org.uk> (raw)
In-Reply-To: <1300955778.2735.68.camel@localhost>
On Thu, Mar 24, 2011 at 10:36:18AM +0200, Artem Bityutskiy wrote:
> On Thu, 2011-03-24 at 08:25 +0000, Russell King - ARM Linux wrote:
> > On Thu, Mar 24, 2011 at 04:18:13PM +0800, Nicolas Ferre wrote:
> > > diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
> > > --- a/drivers/spi/atmel_spi.c
> > > +++ b/drivers/spi/atmel_spi.c
> > > @@ -647,6 +647,22 @@ static void atmel_spi_next_message(struct spi_master *master)
> > > atmel_spi_next_xfer(master, msg);
> > > }
> > >
> > > +static void *adjust_buffer_location(struct device *dev, void *buf)
> > > +{
> > > + if (likely(buf < high_memory)) {
> > > + return buf;
> > > + } else {
> > > + struct page *pg;
> > > +
> > > + pg = vmalloc_to_page(buf);
> > > + if (pg == 0) {
> > > + dev_err(dev, "failed to vmalloc_to_page\n");
> > > + return NULL;
> > > + }
> > > + return page_address(pg) + ((size_t)buf & ~PAGE_MASK);
> > > + }
> > > +}
> > > +
> >
> > This really doesn't fix the problem. If the page is read or written via
> > the vmalloc mapping, you'll have stale data.
> >
> > DMA to vmalloc areas is dodgy at best.
>
> This topics pops up often. So what is the right fix? And sorry for my
> ignorance.
I have no idea. The problem comes down to MTDs interfaces being designed
only for PIO - it's expected that the CPU places data into the virtual
address being passed. This virtual address can be a vmalloc address,
a kmalloc'd address or a page address.
As long as that happens, everything all works because there's no cache
aliasing problems to consider as the buffers are always accessed through
the same mappings.
As soon as there's any attempt to move away from PIO, things get really
sticky because, with *any* DMA noncoherent architecture (it's not limited
to ARM) you run into issues with cache coherency causing data corruption.
When cache maintainence ends up having to deal with virtual addresses for
one level of cache and physical addresses for subseqent levels, the
problems are compounded even more.
The only real answer I can give is: if you want to deal with DMA, you
absolutely must conform to the restrictions on DMA which means that you
can't pass vmalloc addresses to the DMA API.
You can't work around that by converting a vmalloc address to a physical
address and then its coresponding virtual page address as that means the
DMA API will flush the wrong virtual address range and you'll again have
cache incoherency. That goes for *all* of the DMA API interfaces.
next prev parent reply other threads:[~2011-03-24 9:27 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-05 16:49 Hit BUG_ON in dma-mapping.c:425 Nicolas Ferre
2011-01-05 16:55 ` Russell King - ARM Linux
2011-01-06 10:38 ` Nicolas Ferre
2011-01-06 11:19 ` Artem Bityutskiy
2011-03-24 8:18 ` Hit BUG_ON in dma-mapping.c:425 (RFC) Nicolas Ferre
2011-03-24 8:25 ` Russell King - ARM Linux
2011-03-24 8:36 ` Artem Bityutskiy
2011-03-24 9:27 ` Russell King - ARM Linux [this message]
2011-03-24 9:41 ` Russell King - ARM Linux
2011-03-24 11:08 ` Artem Bityutskiy
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=20110324092732.GA19935@n2100.arm.linux.org.uk \
--to=linux@arm.linux.org.uk \
--cc=linux-arm-kernel@lists.infradead.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).