diff options
author | Ed Swierk <eswierk@aristanetworks.com> | 2009-01-26 15:33:31 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-01-27 00:36:19 +0100 |
commit | 3a9f84d354ce1e19956083c8e691727dea33bd5a (patch) | |
tree | abe8c280d3adb7a8e5fc838c59b122a46e6fd464 /kernel/signal.c | |
parent | bf50c903faba4ec7686ee8a570ac384b0f20814d (diff) | |
download | lwn-3a9f84d354ce1e19956083c8e691727dea33bd5a.tar.gz lwn-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.c | 2 |
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) |