summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0003-rtmutex-Add-a-special-case-for-ww-mutex-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0003-rtmutex-Add-a-special-case-for-ww-mutex-handling.patch')
-rw-r--r--debian/patches-rt/0003-rtmutex-Add-a-special-case-for-ww-mutex-handling.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/debian/patches-rt/0003-rtmutex-Add-a-special-case-for-ww-mutex-handling.patch b/debian/patches-rt/0003-rtmutex-Add-a-special-case-for-ww-mutex-handling.patch
new file mode 100644
index 000000000..017012785
--- /dev/null
+++ b/debian/patches-rt/0003-rtmutex-Add-a-special-case-for-ww-mutex-handling.patch
@@ -0,0 +1,48 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Fri, 13 Aug 2021 12:40:49 +0200
+Subject: [PATCH 03/10] rtmutex: Add a special case for ww-mutex handling.
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.15/older/patches-5.15.3-rt21.tar.xz
+
+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 <bigeasy@linutronix.de>
+---
+ kernel/locking/rtmutex.c | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+--- a/kernel/locking/rtmutex.c
++++ b/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;