On Mon, 10 May 2010 12:42:34 +0200 "Oskar Schirmer" <os@xxxxxxxxx> wrote: > With dma based spi transmission, data corruption > is observed occasionally. With dma buffers located > right next to msg and xfer fields, cache lines > correctly flushed in preparation for dma usage > may be polluted again when writing to fields > in the same cache line. > > Make sure cache fields used with dma do not > share cache lines with fields changed during > dma handling. As both fields are part of a > struct that is allocated via kzalloc, thus > cache aligned, moving the fields to the 1st > position and insert padding for alignment > does the job. This sounds odd. Doesn't it imply that some code somewhere is missing some DMA synchronisation actions? > > v2: add a comment to explain why alignment is needed > > v3: fix the typo in comment and layout (- to end of line) > > diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c > index 885354c..9ebb1b4 100644 > --- a/drivers/input/touchscreen/ad7877.c > +++ b/drivers/input/touchscreen/ad7877.c > @@ -153,15 +153,29 @@ enum { > */ > > struct ser_req { > + u16 sample; > + /* > + * DMA (thus cache coherency maintenance) requires the > + * transfer buffers to live in their own cache lines. > + */ > + char __padalign[L1_CACHE_BYTES - sizeof(u16)]; It would be better to use __cacheline_aligned, rather than open-coding things in this manner. -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html