On 12/04/2015 05:05 PM, Linus Torvalds wrote:
On Fri, Dec 4, 2015 at 12:51 PM, Waiman Long<waiman.l...@hpe.com>  wrote:
Will the following work?
Are we trying to win some obfuscated C contest here?

Just make it do something like (skipping backslashes to make it easier
to type and read)

  #define smp_cond_load_acquire(ptr, cond_expr) ({
      typeof(*ptr) VAL;
      for (;;) {
           VAL = READ_ONCE(*ptr);
           if (cond_expr) break;
           cpu_relax();
      }
      smp_rmb();
      VAL;
   })

and then you'd have it be

     val = smp_cond_load_acquire(&lock->val.counter,
                !(VAL&  _Q_LOCKED_PENDING_MASK));

which is at least halfway legible. Not some odd "fragments of
expressions" interfaces unless absolutely required, please.

It is just some random thought that I have. I am not saying that it is the right way to go.

Of course, I suspect we should not use READ_ONCE(), but some
architecture-overridable version that just defaults to READ_ONCE().
Same goes for that "smp_rmb()". Because maybe some architectures will
just prefer an explicit acquire, and I suspect we do *not* want
architectures having to recreate and override that crazy loop.

How much does this all actually end up mattering, btw?

                Linus

I think what Will want to do is to provide an architecture specific replacement for the whole macro, not just part of it. So using READ_ONCE should be fine.

Cheers,
Longman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to