summaryrefslogtreecommitdiffstats
path: root/kernel/signal.c
diff options
context:
space:
mode:
authorEd Swierk <eswierk@aristanetworks.com>2009-01-26 15:33:31 -0800
committerIngo Molnar <mingo@elte.hu>2009-01-27 00:36:19 +0100
commit3a9f84d354ce1e19956083c8e691727dea33bd5a (patch)
treeabe8c280d3adb7a8e5fc838c59b122a46e6fd464 /kernel/signal.c
parentbf50c903faba4ec7686ee8a570ac384b0f20814d (diff)
downloadlinux-3a9f84d354ce1e19956083c8e691727dea33bd5a.tar.gz
linux-3a9f84d354ce1e19956083c8e691727dea33bd5a.tar.bz2
linux-3a9f84d354ce1e19956083c8e691727dea33bd5a.zip
signals, debug: fix BUG: using smp_processor_id() in preemptible code in print_fatal_signal()
With print-fatal-signals=1 on a kernel with CONFIG_PREEMPT=y, sending an unexpected signal to a process causes a BUG: using smp_processor_id() in preemptible code. get_signal_to_deliver() releases the siglock before calling print_fatal_signal(), which calls show_regs(), which calls smp_processor_id(), which is not supposed to be called from a preemptible thread. Make sure show_regs() runs with preemption disabled. Signed-off-by: Ed Swierk <eswierk@aristanetworks.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r--kernel/signal.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kernel/signal.c b/kernel/signal.c
index e73759783dc8..b6b36768b758 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -909,7 +909,9 @@ static void print_fatal_signal(struct pt_regs *regs, int signr)
}
#endif
printk("\n");
+ preempt_disable();
show_regs(regs);
+ preempt_enable();
}
static int __init setup_print_fatal_signals(char *str)