Commit e7eebaf6 authored by Ingo Molnar's avatar Ingo Molnar Committed by Linus Torvalds

[PATCH] pi-futex: rt mutex debug

Runtime debugging functionality for rt-mutexes.
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a6537be9
...@@ -1034,6 +1034,7 @@ static inline void ...@@ -1034,6 +1034,7 @@ static inline void
debug_check_no_locks_freed(const void *from, unsigned long len) debug_check_no_locks_freed(const void *from, unsigned long len)
{ {
mutex_debug_check_no_locks_freed(from, len); mutex_debug_check_no_locks_freed(from, len);
rt_mutex_debug_check_no_locks_freed(from, len);
} }
#ifndef CONFIG_DEBUG_PAGEALLOC #ifndef CONFIG_DEBUG_PAGEALLOC
......
...@@ -40,6 +40,19 @@ struct rt_mutex { ...@@ -40,6 +40,19 @@ struct rt_mutex {
struct rt_mutex_waiter; struct rt_mutex_waiter;
struct hrtimer_sleeper; struct hrtimer_sleeper;
#ifdef CONFIG_DEBUG_RT_MUTEXES
extern int rt_mutex_debug_check_no_locks_freed(const void *from,
unsigned long len);
extern void rt_mutex_debug_check_no_locks_held(struct task_struct *task);
#else
static inline int rt_mutex_debug_check_no_locks_freed(const void *from,
unsigned long len)
{
return 0;
}
# define rt_mutex_debug_check_no_locks_held(task) do { } while (0)
#endif
#ifdef CONFIG_DEBUG_RT_MUTEXES #ifdef CONFIG_DEBUG_RT_MUTEXES
# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ # define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \
, .name = #mutexname, .file = __FILE__, .line = __LINE__ , .name = #mutexname, .file = __FILE__, .line = __LINE__
......
...@@ -17,6 +17,7 @@ ifeq ($(CONFIG_COMPAT),y) ...@@ -17,6 +17,7 @@ ifeq ($(CONFIG_COMPAT),y)
obj-$(CONFIG_FUTEX) += futex_compat.o obj-$(CONFIG_FUTEX) += futex_compat.o
endif endif
obj-$(CONFIG_RT_MUTEXES) += rtmutex.o obj-$(CONFIG_RT_MUTEXES) += rtmutex.o
obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o
obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
obj-$(CONFIG_SMP) += cpu.o spinlock.o obj-$(CONFIG_SMP) += cpu.o spinlock.o
obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o
......
...@@ -929,6 +929,7 @@ fastcall NORET_TYPE void do_exit(long code) ...@@ -929,6 +929,7 @@ fastcall NORET_TYPE void do_exit(long code)
* If DEBUG_MUTEXES is on, make sure we are holding no locks: * If DEBUG_MUTEXES is on, make sure we are holding no locks:
*/ */
mutex_debug_check_no_locks_held(tsk); mutex_debug_check_no_locks_held(tsk);
rt_mutex_debug_check_no_locks_held(tsk);
if (tsk->io_context) if (tsk->io_context)
exit_io_context(); exit_io_context();
......
This diff is collapsed.
/*
* 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. Debug version.
*/
#define __IP_DECL__ , unsigned long ip
#define __IP__ , ip
#define __RET_IP__ , (unsigned long)__builtin_return_address(0)
extern void
rt_mutex_deadlock_account_lock(struct rt_mutex *lock, struct task_struct *task);
extern void rt_mutex_deadlock_account_unlock(struct task_struct *task);
extern void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter);
extern void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter);
extern void debug_rt_mutex_init(struct rt_mutex *lock, const char *name);
extern void debug_rt_mutex_lock(struct rt_mutex *lock __IP_DECL__);
extern void debug_rt_mutex_unlock(struct rt_mutex *lock);
extern void debug_rt_mutex_proxy_lock(struct rt_mutex *lock,
struct task_struct *powner __IP_DECL__);
extern void debug_rt_mutex_proxy_unlock(struct rt_mutex *lock);
extern void debug_rt_mutex_deadlock(int detect, struct rt_mutex_waiter *waiter,
struct rt_mutex *lock);
extern void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter);
# define debug_rt_mutex_reset_waiter(w) \
do { (w)->deadlock_lock = NULL; } while (0)
static inline int debug_rt_mutex_detect_deadlock(struct rt_mutex_waiter *waiter,
int detect)
{
return (waiter != NULL);
}
...@@ -107,6 +107,19 @@ config DEBUG_MUTEXES ...@@ -107,6 +107,19 @@ config DEBUG_MUTEXES
This allows mutex semantics violations and mutex related deadlocks This allows mutex semantics violations and mutex related deadlocks
(lockups) to be detected and reported automatically. (lockups) to be detected and reported automatically.
config DEBUG_RT_MUTEXES
bool "RT Mutex debugging, deadlock detection"
default y
depends on DEBUG_KERNEL && RT_MUTEXES
help
This allows rt mutex semantics violations and rt mutex related
deadlocks (lockups) to be detected and reported automatically.
config DEBUG_PI_LIST
bool
default y
depends on DEBUG_RT_MUTEXES
config DEBUG_SPINLOCK config DEBUG_SPINLOCK
bool "Spinlock debugging" bool "Spinlock debugging"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
......
...@@ -107,6 +107,7 @@ ...@@ -107,6 +107,7 @@
#include <linux/nodemask.h> #include <linux/nodemask.h>
#include <linux/mempolicy.h> #include <linux/mempolicy.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/rtmutex.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
......
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