Thread (96 messages) 96 messages, 15 authors, 2013-11-08

Re: perf events ring buffer memory barrier on powerpc

From: Victor Kaplansky <hidden>
Date: 2013-11-01 14:25:57
Also in: lkml

"Paul E. McKenney" [off-list ref] wrote on 10/31/2013
08:40:15 AM:
quoted
void ubuf_read(void)
{
   u64 head, tail;

   tail = ACCESS_ONCE(ubuf->tail);
   head = ACCESS_ONCE(ubuf->head);

   /*
    * Ensure we read the buffer boundaries before the actual buffer
    * data...
    */
   smp_rmb(); /* C, matches with B */

   while (tail != head) {
      obj = ubuf->data + tail;
      /* process obj */
      tail += obj->size;
      tail %= ubuf->size;
   }

   /*
    * Ensure all data reads are complete before we issue the
    * ubuf->tail update; once that update hits, kbuf_write() can
    * observe and overwrite data.
    */
   smp_mb(); /* D, matches with A */

   ubuf->tail = tail;
}
quoted
Could we replace A and C with an smp_read_barrier_depends()?
C, yes, given that you have ACCESS_ONCE() on the fetch from ->tail
and that the value fetch from ->tail feeds into the address used for
the "obj =" assignment.
No! You must to have a full smp_rmb() at C. The race on the reader side
is not between fetch of @tail and read from address pointed by @tail.
The real race here is between a fetch of @head and read of obj from
memory pointed by @tail.

Regards,
-- Victor
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help