aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/rtmutex-debug.h
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2014-06-05 12:34:23 +0200
committerBen Hutchings <ben@decadent.org.uk>2014-07-11 13:33:50 +0100
commit95f9aded9436aa3ce714aeff3f45fcc1431df7d2 (patch)
tree62529d7b26ce04f1bc6516e7607d9987fadd8b46 /kernel/rtmutex-debug.h
parentd857054b1160cdc83ad0c3dc4db406dbabcf125b (diff)
downloadkernel_samsung_smdk4412-95f9aded9436aa3ce714aeff3f45fcc1431df7d2.zip
kernel_samsung_smdk4412-95f9aded9436aa3ce714aeff3f45fcc1431df7d2.tar.gz
kernel_samsung_smdk4412-95f9aded9436aa3ce714aeff3f45fcc1431df7d2.tar.bz2
rtmutex: Handle deadlock detection smarter
commit 3d5c9340d1949733eb37616abd15db36aef9a57c upstream. Even in the case when deadlock detection is not requested by the caller, we can detect deadlocks. Right now the code stops the lock chain walk and keeps the waiter enqueued, even on itself. Silly not to yell when such a scenario is detected and to keep the waiter enqueued. Return -EDEADLK unconditionally and handle it at the call sites. The futex calls return -EDEADLK. The non futex ones dequeue the waiter, throw a warning and put the task into a schedule loop. Tagged for stable as it makes the code more robust. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Brad Mouring <bmouring@ni.com> Link: http://lkml.kernel.org/r/20140605152801.836501969@linutronix.de Signed-off-by: Thomas Gleixner <tglx@linutronix.de> [bwh: Backported to 3.2: adjust filenames] Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'kernel/rtmutex-debug.h')
-rw-r--r--kernel/rtmutex-debug.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/kernel/rtmutex-debug.h b/kernel/rtmutex-debug.h
index 14193d5..ab29b6a 100644
--- a/kernel/rtmutex-debug.h
+++ b/kernel/rtmutex-debug.h
@@ -31,3 +31,8 @@ static inline int debug_rt_mutex_detect_deadlock(struct rt_mutex_waiter *waiter,
{
return (waiter != NULL);
}
+
+static inline void rt_mutex_print_deadlock(struct rt_mutex_waiter *w)
+{
+ debug_rt_mutex_print_deadlock(w);
+}