diff options
| author | Ed Swierk <eswierk@aristanetworks.com> | 2009-01-26 18:33:31 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-01-26 18:36:19 -0500 |
| commit | 3a9f84d354ce1e19956083c8e691727dea33bd5a (patch) | |
| tree | abe8c280d3adb7a8e5fc838c59b122a46e6fd464 | |
| parent | bf50c903faba4ec7686ee8a570ac384b0f20814d (diff) | |
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>
| -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) | |||
| 909 | } | 909 | } |
| 910 | #endif | 910 | #endif |
| 911 | printk("\n"); | 911 | printk("\n"); |
| 912 | preempt_disable(); | ||
| 912 | show_regs(regs); | 913 | show_regs(regs); |
| 914 | preempt_enable(); | ||
| 913 | } | 915 | } |
| 914 | 916 | ||
| 915 | static int __init setup_print_fatal_signals(char *str) | 917 | static int __init setup_print_fatal_signals(char *str) |
