Messages in this thread |  | | Date | Fri, 04 Dec 2015 17:48:14 -0500 | | From | Waiman Long <> | | Subject | Re: [PATCH 3/4] locking: Introduce smp_cond_acquire() |
| |
On 12/04/2015 05:05 PM, Linus Torvalds wrote: > On Fri, Dec 4, 2015 at 12:51 PM, Waiman Long<waiman.long@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
|  |