Subject: Re: [PATCH/RFC] powerpc: prevent memory corruption due to cache invalidation of unaligned DMA buffer

From: "Gerhard Pircher" <[email-masked]>
Date: Thu, 26 Jun 2008 12:32:15 +0200

-------- Original-Nachricht --------
> Datum: Thu, 26 Jun 2008 17:29:05 +0800
> Von: Andrew Lewis <[email-masked]>
> An: [email-masked]
> CC: \'Andrew Lewis\' <[email-masked]>, [email-masked]
> Betreff: [PATCH/RFC] powerpc: prevent memory corruption due to cache	invalidation of unaligned DMA buffer

> On PowerPC processors with non-coherent cache architectures the DMA
> subsystem calls invalidate_dcache_range() before performing a DMA read
> operation.  If the address and length of the DMA buffer are not aligned
> to a cache-line boundary this can result in memory outside of the DMA
> buffer being invalidated in the cache.  If this memory has an
> uncommitted store then the data will be lost and a subsequent read of
> that address will result in an old value being returned from main memory.
> 
> Only when the DMA buffer starts on a cache-line boundary and is an exact
> mutiple of the cache-line size can invalidate_dcache_range() be called,
> otherwise flush_dcache_range() must be called.  flush_dcache_range()
> will first flush uncommitted writes, and then invalidate the cache.
I have a similar problem, but with a network driver (which uses cacheable
skbuffers as DMA memory). The SLUB allocator should return cache line
aligned memory, but that doesn't prevent data corruption. I fixed it by
setting NET_SKB_PAD (default 16)  to L1_CACHE_BYTES (32 on my 7455
non coherent DMA system).
It looks like your patch could solve my problem without changing
NET_SKB_PAD. I'll have to try that out.

regards,

Gerhard
-- 
Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten 
Browser-Versionen downloaden: http://www.gmx.net/de/go/browser