• T
    sched/wakeup: Introduce the TASK_RTLOCK_WAIT state bit · cd781d0c
    Thomas Gleixner 提交于
    RT kernels have an extra quirk for try_to_wake_up() to handle task state
    preservation across periods of blocking on a 'sleeping' spin/rwlock.
    
    For this to function correctly and under all circumstances try_to_wake_up()
    must be able to identify whether the wakeup is lock related or not and
    whether the task is waiting for a lock or not.
    
    The original approach was to use a special wake_flag argument for
    try_to_wake_up() and just use TASK_UNINTERRUPTIBLE for the tasks wait state
    and the try_to_wake_up() state argument.
    
    This works in principle, but due to the fact that try_to_wake_up() cannot
    determine whether the task is waiting for an RT lock wakeup or for a regular
    wakeup it's suboptimal.
    
    RT kernels save the original task state when blocking on an RT lock and
    restore it when the lock has been acquired. Any non lock related wakeup is
    checked against the saved state and if it matches the saved state is set to
    running so that the wakeup is not lost when the state is restored.
    
    While the necessary logic for the wake_flag based solution is trivial, the
    downside is that any regular wakeup with TASK_UNINTERRUPTIBLE in the state
    argument set will wake the task despite the fact that it is still blocked
    on the lock. That's not a fatal problem as the lock wait has do deal with
    spurious wakeups anyway, but it introduces unnecessary latencies.
    
    Introduce the TASK_RTLOCK_WAIT state bit which will be set when a task
    blocks on an RT lock.
    
    The lock wakeup will use wake_up_state(TASK_RTLOCK_WAIT), so both the
    waiting state and the wakeup state are distinguishable, which avoids
    spurious wakeups and allows better analysis.
    Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: NIngo Molnar <mingo@kernel.org>
    Link: https://lore.kernel.org/r/20210815211302.144989915@linutronix.deSigned-off-by: NIngo Molnar <mingo@kernel.org>
    cd781d0c
sched.h 61.1 KB