Re: [rfc: cpuops adv V1 3/8] x86: this_cpu_cmpxchg and this_cpu_cmpxchg_double operations

Avi Kivity
2010-12-07T09:31:41Z

On 12/06/2010 07:35 PM, Christoph Lameter wrote:
> On Mon, 6 Dec 2010, Avi Kivity wrote:
>
> > On 12/02/2010 11:53 PM, Christoph Lameter wrote:
> > > Provide support as far as the hardware capabilities of the x86 cpus
> > > allow.
> > >
> > >
> > >
> > > +/*
> > > + * Beware: xchg on x86 has an implied lock prefix. There will be the cost
> > > of
> > > + * full lock semantics even though they are not needed.
> > > + */
> >
> > Perhaps we can use cmpxchg instead of xchg to avoid this? costs one more
> > instruction but may be worth it.
>
> Hmmm... Maybe good since I also need a xchg_double. And xchg_double can
> only be realized with cmpxchg16b. Using cmpxchg would make it consistent.

I don't think we need to worry about consistency, this is an
implementation not an interface.

We have three choices:

xchg %1, %0

atomic, one instruction

1: cmpxchg %2, %0
jnz 1b

two non-atomic instructions, potential mispredicted jump, extra clobber
(%1 == "=a")

mov %0, %1
1: cmpxchg %2, %0
jnz 1b

three non-atomic instructions, no mispredict, extra clobber

--
error compiling committee.c: too many arguments to function