lkml.org 
[lkml]   [2010]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v3] ad7877: keep dma rx buffers in seperate cache lines
    On Mon, 10 May 2010 12:42:34 +0200
    "Oskar Schirmer" <os@emlix.com> 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.



    \
     
     \ /
      Last update: 2010-05-12 11:27    [W:0.026 / U:302.420 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site