Re: [PATCH for-4.17 2/2] powerpc: Remove smp_mb() from arch_spin_is_locked()

From: Michael Ellerman
Date: Wed Apr 04 2018 - 06:28:19 EST

Peter Zijlstra <peterz@xxxxxxxxxxxxx> writes:

> On Wed, Mar 28, 2018 at 04:25:37PM +1100, Michael Ellerman wrote:
>> That was tempting, but it leaves unfixed all the other potential
>> callers, both in in-tree and out-of-tree and in code that's yet to be
>> written.
> So I myself don't care one teeny tiny bit about out of tree code, they
> get to keep their pieces :-)

I agree, but somehow I still end up seeing the pieces from time to time :)

>> Looking today nearly all the callers are debug code, where we probably
>> don't need the barrier but we also don't care about the overhead of the
>> barrier.
> Still, code like:
> WARN_ON_ONCE(!spin_is_locked(foo));
> will unconditionally emit that SYNC. So you might want to be a little
> careful.
>> Documenting it would definitely be good, but even then I'd be inclined
>> to leave the barrier in our implementation. Matching the documented
>> behaviour is one thing, but the actual real-world behaviour on well
>> tested platforms (ie. x86) is more important.
> By that argument you should switch your spinlock implementation to RCpc
> and include that SYNC in either lock or unlock already ;-)


Unfortunately performance is also a thing :/

I ran the numbers again, switching to sync on unlock is a 30% hit for an
uncontended lock/unlock loop. Which is not going to make me any friends.

> Ideally we'd completely eradicate the *_is_locked() crud from the
> kernel, not sure how feasable that really is, but it's a good goal. At
> that point the whole issue of the barrier becomes moot of course.

Yeah that would be good. The majority of them could/should be using
lockdep_is_held(), though there are still a handful that are actually
using it in non-debug logic.