From c8f5f37877c96ee55def1dccfc847d236abc4480 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Mon, 9 Jan 2006 15:59:21 -0800 Subject: [PATCH] --- yaml --- r: 17471 b: refs/heads/master c: de5097c2e73f826302cd8957c225b3725e0c7553 h: refs/heads/master i: 17469: 03bd85e46dce01620ef4d93dde16b6e64212d556 17467: d27381cee699b60115e07556f966bdf1442a5fcf 17463: dbf171101c12f6c2a26a7091b4364381893522fb 17455: cf9e976f0bf1086face37db4d2910c6684b50b46 17439: 47b7d68bac9420b2b11c1d9a3e14653e53b15f85 17407: bd354ad2ecf8084b02b062002373b13966f0d560 v: v3 --- [refs] | 2 +- trunk/arch/i386/mm/pageattr.c | 4 ++++ trunk/drivers/char/sysrq.c | 19 +++++++++++++++++++ trunk/include/linux/mm.h | 4 ++++ trunk/kernel/exit.c | 5 +++++ trunk/kernel/sched.c | 1 + trunk/mm/page_alloc.c | 3 +++ trunk/mm/slab.c | 1 + 8 files changed, 38 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ba5be66fb1ad..e71a84c4c814 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 408894ee4dd4debfdedd472eb4d8414892fc90f6 +refs/heads/master: de5097c2e73f826302cd8957c225b3725e0c7553 diff --git a/trunk/arch/i386/mm/pageattr.c b/trunk/arch/i386/mm/pageattr.c index c30a16df6440..e8a53552b13d 100644 --- a/trunk/arch/i386/mm/pageattr.c +++ b/trunk/arch/i386/mm/pageattr.c @@ -222,6 +222,10 @@ void kernel_map_pages(struct page *page, int numpages, int enable) { 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. */ diff --git a/trunk/drivers/char/sysrq.c b/trunk/drivers/char/sysrq.c index 145275ebdd7e..5765f672e853 100644 --- a/trunk/drivers/char/sysrq.c +++ b/trunk/drivers/char/sysrq.c @@ -153,6 +153,21 @@ static struct sysrq_key_op sysrq_mountro_op = { /* 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_table[SYSRQ_KEY_TABLE_LENGTH] = { #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, diff --git a/trunk/include/linux/mm.h b/trunk/include/linux/mm.h index df80e63903b5..3f1fafc0245e 100644 --- a/trunk/include/linux/mm.h +++ b/trunk/include/linux/mm.h @@ -13,6 +13,7 @@ #include #include #include +#include struct mempolicy; struct anon_vma; @@ -1024,6 +1025,9 @@ static inline void vm_stat_account(struct mm_struct *mm, static 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 diff --git a/trunk/kernel/exit.c b/trunk/kernel/exit.c index caceabf3f230..309a46fa16f8 100644 --- a/trunk/kernel/exit.c +++ b/trunk/kernel/exit.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -869,6 +870,10 @@ fastcall NORET_TYPE void do_exit(long code) mpol_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(); diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 92733091154c..34a945bcc022 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -4386,6 +4386,7 @@ void show_state(void) } while_each_thread(g, p); read_unlock(&tasklist_lock); + mutex_debug_show_all_locks(); } /** diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index e0e84924171b..a5e6891f7bb6 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -415,6 +415,9 @@ static void __free_pages_ok(struct page *page, unsigned int order) int reserved = 0; arch_free_page(page, order); + if (!PageHighMem(page)) + mutex_debug_check_no_locks_freed(page_address(page), + page_address(page+(1<