Still have two cmpxchgs in the common case. The first iteration willRight, another option is to put the initial read outside of the loop,
fail, fetching last_value, the second will work.
It will be better when we have contention, though, so it's worthwhile.
that way you'll have the best of all cases, a single LOCK'ed op in the
loop, and only a single LOCK'ed op for the fast path on sensible
architectures ;-)
last = atomic64_read(&last_value);
do {
if (ret< last)
return last;
last = atomic64_cmpxchg(&last_value, last, ret);
} while (unlikely(last != ret));
Or so.