[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20131102172840.GA3947@linux.vnet.ibm.com>
Date: Sat, 2 Nov 2013 10:28:40 -0700
From: "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
To: Victor Kaplansky <VICTORK@...ibm.com>
Cc: Anton Blanchard <anton@...ba.org>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Frederic Weisbecker <fweisbec@...il.com>,
LKML <linux-kernel@...r.kernel.org>,
Linux PPC dev <linuxppc-dev@...abs.org>,
Mathieu Desnoyers <mathieu.desnoyers@...ymtl.ca>,
Michael Ellerman <michael@...erman.id.au>,
Michael Neuling <mikey@...ling.org>,
Oleg Nesterov <oleg@...hat.com>,
Peter Zijlstra <peterz@...radead.org>
Subject: Re: perf events ring buffer memory barrier on powerpc
On Fri, Nov 01, 2013 at 04:25:42PM +0200, Victor Kaplansky wrote:
> "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com> wrote on 10/31/2013
> 08:40:15 AM:
>
> > > 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;
> > > }
>
> > > 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.
I believe you are in fact correct, good catch.
Thanx, Paul
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists