From 8320ef68934848e7f95acb4ff28f40ce3bb9c2da Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Wed, 6 Dec 2006 20:35:59 -0800 Subject: [PATCH] --- yaml --- r: 42779 b: refs/heads/master c: e59e2ae2c29700117a54e85c106017c24837119f h: refs/heads/master i: 42777: 069f66305f0a821cb89686fadfcf5e2885d50050 42775: 84c84607927175d428d6cd64de250ec236fcc2e0 v: v3 --- [refs] | 2 +- trunk/drivers/char/sysrq.c | 14 +++++++++++++- trunk/include/linux/sched.h | 11 ++++++++++- trunk/kernel/sched.c | 11 ++++++++--- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index c407b7dc4e64..618ec0b5367a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 875d95ec9eb69ffb334116fb44d04d9a64dcbfbb +refs/heads/master: e59e2ae2c29700117a54e85c106017c24837119f diff --git a/trunk/drivers/char/sysrq.c b/trunk/drivers/char/sysrq.c index c64f5bcff947..05810c8d20bc 100644 --- a/trunk/drivers/char/sysrq.c +++ b/trunk/drivers/char/sysrq.c @@ -182,6 +182,18 @@ static struct sysrq_key_op sysrq_showstate_op = { .enable_mask = SYSRQ_ENABLE_DUMP, }; +static void sysrq_handle_showstate_blocked(int key, struct tty_struct *tty) +{ + show_state_filter(TASK_UNINTERRUPTIBLE); +} +static struct sysrq_key_op sysrq_showstate_blocked_op = { + .handler = sysrq_handle_showstate_blocked, + .help_msg = "showBlockedTasks", + .action_msg = "Show Blocked State", + .enable_mask = SYSRQ_ENABLE_DUMP, +}; + + static void sysrq_handle_showmem(int key, struct tty_struct *tty) { show_mem(); @@ -304,7 +316,7 @@ static struct sysrq_key_op *sysrq_key_table[36] = { /* May be assigned at init time by SMP VOYAGER */ NULL, /* v */ NULL, /* w */ - NULL, /* x */ + &sysrq_showstate_blocked_op, /* x */ NULL, /* y */ NULL /* z */ }; diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index 837a012f573c..0a90cefb0b0d 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -194,7 +194,16 @@ extern void init_idle(struct task_struct *idle, int cpu); extern cpumask_t nohz_cpu_mask; -extern void show_state(void); +/* + * Only dump TASK_* tasks. (-1 for all tasks) + */ +extern void show_state_filter(unsigned long state_filter); + +static inline void show_state(void) +{ + show_state_filter(-1); +} + extern void show_regs(struct pt_regs *); /* diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 12fdbef1d9bf..1848e280504d 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -4804,7 +4804,7 @@ static void show_task(struct task_struct *p) show_stack(p, NULL); } -void show_state(void) +void show_state_filter(unsigned long state_filter) { struct task_struct *g, *p; @@ -4824,11 +4824,16 @@ void show_state(void) * console might take alot of time: */ touch_nmi_watchdog(); - show_task(p); + if (p->state & state_filter) + show_task(p); } while_each_thread(g, p); read_unlock(&tasklist_lock); - debug_show_all_locks(); + /* + * Only show locks if all tasks are dumped: + */ + if (state_filter == -1) + debug_show_all_locks(); } /**