mutex subsystem, debugging code
Subsystems (5)
PATCH 9/13 mutex subsystem, debugging code
mutex implementation - add debugging code.
Signed-off-by Ingo Molnar <[email protected]>
Signed-off-by Arjan van de Ven <[email protected]>
----
include/linux/mutex-debug.h | 21 + include/linux/sched.h | 5 kernel/Makefile | 1 kernel/fork.c | 4 kernel/mutex-debug.c | 463 ++++++++++++++++++++++++++++++++++++++++++++ kernel/mutex-debug.h | 134 ++++++++++++ lib/Kconfig.debug | 8 7 files changed, 636 insertions(+)
include/linux/mutex-debug.h new file +21 -0
@@ -0,0 +1,21 @@ +#ifndef __LINUX_MUTEX_DEBUG_H +#define __LINUX_MUTEX_DEBUG_H + +/* +* Mutexes - debugging helpers: +*/ + +#define __DEBUG_MUTEX_INITIALIZER (lockname) \ + , .held_list = LIST_HEAD_INIT(lockname.held_list), \ + .name = #lockname , .magic = &lockname + +#define mutex_init (sem) __mutex_init(sem, __FUNCTION__) + +extern void FASTCALL (mutex_destroy (struct mutex *lock)); + +extern void mutex_debug_show_all_locks (void ); +extern void mutex_debug_show_held_locks (struct task_struct *filter); +extern void mutex_debug_check_no_locks_held (struct task_struct *task); +extern void mutex_debug_check_no_locks_freed (const void *from,const void *to); + +#endif
include/linux/sched.h +5 -0
@@ -820,6 +820,11 @@ struct task_struct {/* Protection of proc_dentry: nesting proc_lock, dcache_lock, write_lock_irq(&tasklist_lock); */ spinlock_t proc_lock; +#ifdef CONFIG_DEBUG_MUTEXES +/* mutex deadlock detection */ +struct mutex_waiter *blocked_on; +#endif +/* journalling filesystem info */ void *journal_info;
kernel/Makefile +1 -0
@@ -9,6 +9,7 @@ obj-y = sched.o fork.o exec_domain.o rcupdate.o intermodule.o extable.o params.o posix-timers.o \ kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o +obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o obj-$(CONFIG_FUTEX) += futex.o obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += cpu.o spinlock.o
kernel/fork.c +4 -0
@@ -973,6 +973,10 @@ static task_t *copy_process(unsigned lon }#endif +#ifdef CONFIG_DEBUG_MUTEXES + p->blocked_on =NULL ;/* not blocked yet */ +#endif + p->tgid = p->pid;if (clone_flags &CLONE_THREAD ) p->tgid = current->tgid;
kernel/mutex-debug.c new file +463 -0
463 lines not on this page · raw message
kernel/mutex-debug.h new file +134 -0
134 lines not on this page · raw message
lib/Kconfig.debug +8 -0
@@ -95,6 +95,14 @@ config DEBUG_PREEMPT if kernel code uses it in a preemption-unsafe way. Also, the kernel will detect preemption count underflows. +config DEBUG_MUTEXES + bool "Mutex debugging, deadlock detection" + default y + depends on DEBUG_KERNEL + help + This allows mutex semantics violations and mutex related deadlocks + (lockups) to be detected and reported automatically. + config DEBUG_SPINLOCK bool "Spinlock debugging" depends on DEBUG_KERNEL