From a1148e600310b8a101499256a10352612724fe11 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Fri, 13 Aug 2021 12:40:49 +0200 Subject: [PATCH 080/158] rtmutex: Add a special case for ww-mutex handling. The lockdep selftest for ww-mutex assumes in a few cases the ww_ctx->contending_lock assignment via __ww_mutex_check_kill() which does not happen if the rtmutex detects the deadlock early. The testcase passes if the deadlock handling here is removed. This means that it will work if multiple threads/tasks are involved and not just a single one. Signed-off-by: Sebastian Andrzej Siewior --- kernel/locking/rtmutex.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) Index: linux-5.15.19-rt29/kernel/locking/rtmutex.c =================================================================== --- linux-5.15.19-rt29.orig/kernel/locking/rtmutex.c +++ linux-5.15.19-rt29/kernel/locking/rtmutex.c @@ -1097,8 +1097,26 @@ static int __sched task_blocks_on_rt_mut * which is wrong, as the other waiter is not in a deadlock * situation. */ - if (owner == task) + if (owner == task) { +#if defined(DEBUG_WW_MUTEXES) && defined(CONFIG_DEBUG_LOCKING_API_SELFTESTS) + /* + * The lockdep selftest for ww-mutex assumes in a few cases + * the ww_ctx->contending_lock assignment via + * __ww_mutex_check_kill() which does not happen if the rtmutex + * detects the deadlock early. + */ + if (build_ww_mutex() && ww_ctx) { + struct rt_mutex *rtm; + + /* Check whether the waiter should backout immediately */ + rtm = container_of(lock, struct rt_mutex, rtmutex); + + __ww_mutex_add_waiter(waiter, rtm, ww_ctx); + __ww_mutex_check_kill(rtm, waiter, ww_ctx); + } +#endif return -EDEADLK; + } raw_spin_lock(&task->pi_lock); waiter->task = task;