On Fri, Jun 03, 2016 at 03:42:49PM +0200, Peter Zijlstra wrote:
> On Fri, Jun 03, 2016 at 01:47:34PM +0100, Will Deacon wrote:
> > Even on x86, I think you need a fence here:
> > 
> > X86 lock
> > {
> > }
> >  P0                | P1                ;
> >  MOV EAX,$1        | MOV EAX,$1        ;
> >  LOCK XCHG [x],EAX | LOCK XCHG [y],EAX ;
> >  MOV EBX,[y]       | MOV EBX,[x]       ;
> > exists
> > (0:EAX=0 /\ 0:EBX=0 /\ 1:EAX=0 /\ 1:EBX=0)
> > 
> > is permitted by herd.
> 
> I am puzzled.. this should not be. You say adding MFENCE after LOCK XCHG
> makes it 'work', but we assume LOCK <op> is a full fence all over the
> place.
> 
> I'm thinking herd is busted.

FWIW -- I spoke to the Herd authors and they confirmed that this is a
regresion in herd (fixed in the bleeding edge version).

Will

Reply via email to