• Peter Zijlstra's avatar
    bitops: Do not default to __clear_bit() for __clear_bit_unlock() · f75d4864
    Peter Zijlstra authored
    __clear_bit_unlock() is a special little snowflake. While it carries the
    non-atomic '__' prefix, it is specifically documented to pair with
    test_and_set_bit() and therefore should be 'somewhat' atomic.
    
    Therefore the generic implementation of __clear_bit_unlock() cannot use
    the fully non-atomic __clear_bit() as a default.
    
    If an arch is able to do better; is must provide an implementation of
    __clear_bit_unlock() itself.
    
    Specifically, this came up as a result of hackbench livelock'ing in
    slab_lock() on ARC with SMP + SLUB + !LLSC.
    
    The issue was incorrect pairing of atomic ops.
    
     slab_lock() -> bit_spin_lock() -> test_and_set_bit()
     slab_unlock() -> __bit_spin_unlock() -> __clear_bit()
    
    The non serializing __clear_bit() was getting "lost"
    
     80543b8e:	ld_s       r2,[r13,0] <--- (A) Finds PG_locked is set
     80543b90:	or         r3,r2,1    <--- (B) other core unlocks right here
     80543b94:	st_s       r3,[r13,0] <--- (C) sets PG_locked (overwrites unlock)
    
    Fixes ARC STAR 9000817404 (and probably more).
    Reported-by: 's avatarVineet Gupta <Vineet.Gupta1@synopsys.com>
    Tested-by: 's avatarVineet Gupta <Vineet.Gupta1@synopsys.com>
    Signed-off-by: 's avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Helge Deller <deller@gmx.de>
    Cc: James E.J. Bottomley <jejb@parisc-linux.org>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Noam Camus <noamc@ezchip.com>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20160309114054.GJ6356@twins.programming.kicks-ass.netSigned-off-by: 's avatarIngo Molnar <mingo@kernel.org>
    f75d4864
Name
Last commit
Last update
..
__ffs.h Loading commit data...
__fls.h Loading commit data...
arch_hweight.h Loading commit data...
atomic.h Loading commit data...
builtin-__ffs.h Loading commit data...
builtin-__fls.h Loading commit data...
builtin-ffs.h Loading commit data...
builtin-fls.h Loading commit data...
const_hweight.h Loading commit data...
ext2-atomic-setbit.h Loading commit data...
ext2-atomic.h Loading commit data...
ffs.h Loading commit data...
ffz.h Loading commit data...
find.h Loading commit data...
fls.h Loading commit data...
fls64.h Loading commit data...
hweight.h Loading commit data...
le.h Loading commit data...
lock.h Loading commit data...
non-atomic.h Loading commit data...
sched.h Loading commit data...