• Kirill Tkhai's avatar
    locking/rwsem-spinlock: Add killable versions of __down_read() · 0aa1125f
    Kirill Tkhai authored
    Rename __down_read() in __down_read_common() and teach it
    to abort waiting in case of pending signals and killable
    state argument passed.
    
    Note, that we shouldn't wake anybody up in EINTR path, as:
    
    We check for signal_pending_state() after (!waiter.task)
    test and under spinlock. So, current task wasn't able to
    be woken up. It may be in two cases: a writer is owner
    of the sem, or a writer is a first waiter of the sem.
    
    If a writer is owner of the sem, no one else may work
    with it in parallel. It will wake somebody, when it
    call up_write() or downgrade_write().
    
    If a writer is the first waiter, it will be woken up,
    when the last active reader releases the sem, and
    sem->count became 0.
    
    Also note, that set_current_state() may be moved down
    to schedule() (after !waiter.task check), as all
    assignments in this type of semaphore (including wake_up),
    occur under spinlock, so we can't miss anything.
    Signed-off-by: default avatarKirill Tkhai <ktkhai@virtuozzo.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: arnd@arndb.de
    Cc: avagin@virtuozzo.com
    Cc: davem@davemloft.net
    Cc: fenghua.yu@intel.com
    Cc: gorcunov@virtuozzo.com
    Cc: heiko.carstens@de.ibm.com
    Cc: hpa@zytor.com
    Cc: ink@jurassic.park.msu.ru
    Cc: mattst88@gmail.com
    Cc: rth@twiddle.net
    Cc: schwidefsky@de.ibm.com
    Cc: tony.luck@intel.com
    Link: http://lkml.kernel.org/r/149789533283.9059.9829416940494747182.stgit@localhost.localdomainSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    0aa1125f
rwsem-spinlock.c 7.62 KB