Commit 6467822b authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Thomas Gleixner
Browse files

locking/rtmutex: Prevent spurious EDEADLK return caused by ww_mutexes

rtmutex based ww_mutexes can legitimately create a cycle in the lock graph
which can be observed by a blocker which didn't cause the problem:

   P1: A, ww_A, ww_B
   P2: ww_B, ww_A
   P3: A

P3 might therefore be trapped in the ww_mutex induced cycle and run into
the lock depth limitation of rt_mutex_adjust_prio_chain() which returns
-EDEADLK to the caller.

Disable the deadlock detection walk when the chain walk observes a
ww_mutex to prevent this looping.

[ tglx: Split it apart and added changelog ]
Reported-by: default avatarSebastian Siewior <>
Fixes: add46132

 ("locking/rtmutex: Extend the rtmutex core to support ww_mutex")
Signed-off-by: default avatarPeter Zijlstra (Intel) <>
Signed-off-by: default avatarThomas Gleixner <>
parent 37e8abff
......@@ -656,6 +656,31 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
if (next_lock != waiter->lock)
goto out_unlock_pi;
* There could be 'spurious' loops in the lock graph due to ww_mutex,
* consider:
* P1: A, ww_A, ww_B
* P2: ww_B, ww_A
* P3: A
* P3 should not return -EDEADLK because it gets trapped in the cycle
* created by P1 and P2 (which will resolve -- and runs into
* max_lock_depth above). Therefore disable detect_deadlock such that
* the below termination condition can trigger once all relevant tasks
* are boosted.
* Even when we start with ww_mutex we can disable deadlock detection,
* since we would supress a ww_mutex induced deadlock at [6] anyway.
* Supressing it here however is not sufficient since we might still
* hit [6] due to adjustment driven iteration.
* NOTE: if someone were to create a deadlock between 2 ww_classes we'd
* utterly fail to report it; lockdep should.
if (IS_ENABLED(CONFIG_PREEMPT_RT) && waiter->ww_ctx && detect_deadlock)
detect_deadlock = false;
* Drop out, when the task has no waiters. Note,
* top_waiter can be NULL, when we are in the deboosting
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment