• Thomas Gleixner's avatar
    locking/rtmutex: Add wake_state to rt_mutex_waiter · c014ef69
    Thomas Gleixner authored
    Regular sleeping locks like mutexes, rtmutexes and rw_semaphores are always
    entering and leaving a blocking section with task state == TASK_RUNNING.
    
    On a non-RT kernel spinlocks and rwlocks never affect the task state, but
    on RT kernels these locks are converted to rtmutex based 'sleeping' locks.
    
    So in case of contention the task goes to block, which requires to carefully
    preserve the task state, and restore it after acquiring the lock taking
    regular wakeups for the task into account, which happened while the task was
    blocked. This state preserving is achieved by having a separate task state
    for blocking on a RT spin/rwlock and a saved_state field in task_struct
    along with careful handling of these wakeup scenarios in try_to_wake_up().
    
    To avoid conditionals in the rtmutex code, store the wake state which has
    to be used for waking a lock waiter in rt_mutex_waiter which allows to
    handle the regular and RT spin/rwlocks by handing it to wake_up_state().
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20210815211303.079800739@linutronix.de
    c014ef69
rtmutex.c 37.5 KB