• Davidlohr Bueso's avatar
    locking/rwsem: Avoid deceiving lock spinners · b3fd4f03
    Davidlohr Bueso authored
    When readers hold the semaphore, the ->owner is nil. As such,
    and unlike mutexes, '!owner' does not necessarily imply that
    the lock is free. This will cause writers to potentially spin
    excessively as they've been mislead to thinking they have a
    chance of acquiring the lock, instead of blocking.
    
    This patch therefore enhances the counter check when the owner
    is not set by the time we've broken out of the loop. Otherwise
    we can return true as a new owner has the lock and thus we want
    to continue spinning. While at it, we can make rwsem_spin_on_owner()
    less ambiguos and return right away under need_resched conditions.
    Signed-off-by: default avatarDavidlohr Bueso <dbueso@suse.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Jason Low <jason.low2@hp.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Tim Chen <tim.c.chen@linux.intel.com>
    Link: http://lkml.kernel.org/r/1422609267-15102-5-git-send-email-dave@stgolabs.netSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    b3fd4f03
rwsem-xadd.c 14.4 KB