mutex subsystem, more debugging code
Subsystems (4)
PATCH 8/9 mutex subsystem, more debugging code
more mutex debugging: check for held locks during memory freeing, task exit, enable sysrq printouts, etc.
Signed-off-by Ingo Molnar <[email protected]>
----
arch/i386/mm/pageattr.c | 4 ++++ drivers/char/sysrq.c | 19 +++++++++++++++++++ include/linux/mm.h | 4 ++++ kernel/exit.c | 5 +++++ kernel/sched.c | 1 + mm/page_alloc.c | 3 +++ mm/slab.c | 1 + 7 files changed, 37 insertions(+)
arch/i386/mm/pageattr.c +4 -0
@@ -207,6 +207,10 @@ void kernel_map_pages(struct page *page, {if (PageHighMem (page))return ; +if (!enable) +mutex_debug_check_no_locks_freed (page_address (page), +page_address (page+numpages)); +/* the return value is ignored - the calls cannot fail, * large pages are disabled at boot time. */
drivers/char/sysrq.c +19 -0
@@ -153,6 +153,21 @@ static struct sysrq_key_op sysrq_mountro/* END SYNC SYSRQ HANDLERS BLOCK */ +#ifdef CONFIG_DEBUG_MUTEXES + +static void +sysrq_handle_showlocks (int key,struct pt_regs *pt_regs,struct tty_struct *tty) +{ +mutex_debug_show_all_locks (); +} + +static struct sysrq_key_op sysrq_showlocks_op = { + .handler = sysrq_handle_showlocks, + .help_msg ="show-all-locks(D)" , + .action_msg ="Show Locks Held" , +}; + +#endif /* SHOW SYSRQ HANDLERS BLOCK */
@@ -294,7 +309,11 @@ static struct sysrq_key_op *sysrq_key_ta#else /* c */ NULL,#endif +#ifdef CONFIG_DEBUG_MUTEXES +/* d */ &sysrq_showlocks_op, +#else/* d */ NULL , +#endif/* e */ &sysrq_term_op,/* f */ &sysrq_moom_op, /* g */ NULL,
include/linux/mm.h +4 -0
@@ -13,6 +13,7 @@#include <linux/rbtree.h> #include <linux/prio_tree.h> #include <linux/fs.h> +#include <linux/mutex.h> struct mempolicy ;struct anon_vma ;
@@ -977,6 +978,9 @@ static inline void vm_stat_account(strucstatic inline void kernel_map_pages (struct page *page,int numpages,int enable) { +if (!PageHighMem (page) && !enable) +mutex_debug_check_no_locks_freed (page_address (page), +page_address (page + numpages)); }#endif
kernel/exit.c +5 -0
@@ -29,6 +29,7 @@#include <linux/syscalls.h> #include <linux/signal.h> #include <linux/cn_proc.h> +#include <linux/mutex.h> #include <asm/uaccess.h> #include <asm/unistd.h>
@@ -870,6 +871,10 @@ fastcall NORET_TYPE void do_exit(long compol_free (tsk->mempolicy); tsk->mempolicy =NULL ;#endif +/* +* If DEBUG_MUTEXES is on, make sure we are holding no locks: +*/ +mutex_debug_check_no_locks_held (tsk);/* PF_DEAD causes final put_task_struct after we schedule. */ preempt_disable ();
kernel/sched.c +1 -0
@@ -4379,6 +4379,7 @@ void show_state(void) }while_each_thread (g, p);read_unlock (&tasklist_lock); +mutex_debug_show_all_locks (); }/**
mm/page_alloc.c +3 -0
@@ -400,6 +400,9 @@ void __free_pages_ok(struct page *page,int reserved =0 ;arch_free_page (page, order); +if (!PageHighMem (page)) +mutex_debug_check_no_locks_freed (page_address (page), +page_address (page+(1 <<order)));#ifndef CONFIG_MMU if (order >0 )
mm/slab.c +1 -0
@@ -3038,6 +3038,7 @@ void kfree(const void *objp)local_irq_save (flags);kfree_debugcheck (objp); c =page_get_cache (virt_to_page (objp)); +mutex_debug_check_no_locks_freed (objp, objp+obj_reallen (c));__cache_free (c, (void *)objp);local_irq_restore (flags); }