Skip to content
  • Will Deacon's avatar
    mutex: Place lock in contended state after fastpath_lock failure · 0bce9c46
    Will Deacon authored
    
    
    ARM recently moved to asm-generic/mutex-xchg.h for its mutex
    implementation after the previous implementation was found to be missing
    some crucial memory barriers. However, this has revealed some problems
    running hackbench on SMP platforms due to the way in which the
    MUTEX_SPIN_ON_OWNER code operates.
    
    The symptoms are that a bunch of hackbench tasks are left waiting on an
    unlocked mutex and therefore never get woken up to claim it. This boils
    down to the following sequence of events:
    
            Task A        Task B        Task C        Lock value
    0                                                     1
    1       lock()                                        0
    2                     lock()                          0
    3                     spin(A)                         0
    4       unlock()                                      1
    5                                   lock()            0
    6                     cmpxchg(1,0)                    0
    7                     contended()                    -1
    8       lock()                                        0
    9       spin(C)                                       0
    10                                  unlock()          1
    11      cmpxchg(1,0)                                  0
    12      unlock()                                      1
    
    At this point, the lock is unlocked, but Task B is in an uninterruptible
    sleep with nobody to wake it up.
    
    This patch fixes the problem by ensuring we put the lock into the
    contended state if we fail to acquire it on the fastpath, ensuring that
    any blocked waiters are woken up when the mutex is released.
    
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Chris Mason <chris.mason@fusionio.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: <stable@vger.kernel.org>
    Reviewed-by: default avatarNicolas Pitre <nico@linaro.org>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/n/tip-6e9lrw2avczr0617fzl5vqb8@git.kernel.org
    
    
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    0bce9c46