diff options
author | Satyam Sharma <satyam@infradead.org> | 2007-10-24 18:23:50 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-10-24 18:23:50 +0200 |
commit | 838225b48edc971620cbeb292034dabd2b0d7d1d (patch) | |
tree | c4248521fead10f50f4539b6859339aeeef118d7 /kernel/sched.c | |
parent | 4dcf6aff023d9934630fb3649284951831c51f8f (diff) | |
download | lwn-838225b48edc971620cbeb292034dabd2b0d7d1d.tar.gz lwn-838225b48edc971620cbeb292034dabd2b0d7d1d.zip |
sched: use show_regs() to improve __schedule_bug() output
A full register dump along with stack backtrace would make the
"scheduling while atomic" message more helpful. Use show_regs() instead
of dump_stack() for this. We already know we're atomic in here (that is
why this function was called) so show_regs()'s atomicity expectations
are guaranteed.
Also, modify the output of the "BUG: scheduling while atomic:" header a
bit to keep task->comm and task->pid together and preempt_count() after
them.
Signed-off-by: Satyam Sharma <satyam@infradead.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index af02a4de069b..d1e6663d3ab0 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -66,6 +66,7 @@ #include <linux/pagemap.h> #include <asm/tlb.h> +#include <asm/irq_regs.h> /* * Scheduler clock - returns current time in nanosec units. @@ -3507,12 +3508,19 @@ EXPORT_SYMBOL(sub_preempt_count); */ static noinline void __schedule_bug(struct task_struct *prev) { - printk(KERN_ERR "BUG: scheduling while atomic: %s/0x%08x/%d\n", - prev->comm, preempt_count(), task_pid_nr(prev)); + struct pt_regs *regs = get_irq_regs(); + + printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n", + prev->comm, prev->pid, preempt_count()); + debug_show_held_locks(prev); if (irqs_disabled()) print_irqtrace_events(prev); - dump_stack(); + + if (regs) + show_regs(regs); + else + dump_stack(); } /* |