forked from Minki/linux
3d5c9340d1
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 Cc: stable@vger.kernel.org Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
32 lines
1.2 KiB
C
32 lines
1.2 KiB
C
/*
|
|
* RT-Mutexes: blocking mutual exclusion locks with PI support
|
|
*
|
|
* started by Ingo Molnar and Thomas Gleixner:
|
|
*
|
|
* Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
|
|
* Copyright (C) 2006, Timesys Corp., Thomas Gleixner <tglx@timesys.com>
|
|
*
|
|
* This file contains macros used solely by rtmutex.c.
|
|
* Non-debug version.
|
|
*/
|
|
|
|
#define rt_mutex_deadlock_check(l) (0)
|
|
#define rt_mutex_deadlock_account_lock(m, t) do { } while (0)
|
|
#define rt_mutex_deadlock_account_unlock(l) do { } while (0)
|
|
#define debug_rt_mutex_init_waiter(w) do { } while (0)
|
|
#define debug_rt_mutex_free_waiter(w) do { } while (0)
|
|
#define debug_rt_mutex_lock(l) do { } while (0)
|
|
#define debug_rt_mutex_proxy_lock(l,p) do { } while (0)
|
|
#define debug_rt_mutex_proxy_unlock(l) do { } while (0)
|
|
#define debug_rt_mutex_unlock(l) do { } while (0)
|
|
#define debug_rt_mutex_init(m, n) do { } while (0)
|
|
#define debug_rt_mutex_deadlock(d, a ,l) do { } while (0)
|
|
#define debug_rt_mutex_print_deadlock(w) do { } while (0)
|
|
#define debug_rt_mutex_detect_deadlock(w,d) (d)
|
|
#define debug_rt_mutex_reset_waiter(w) do { } while (0)
|
|
|
|
static inline void rt_mutex_print_deadlock(struct rt_mutex_waiter *w)
|
|
{
|
|
WARN(1, "rtmutex deadlock detected\n");
|
|
}
|