diff options
author | Alexander van Heukelum <heukelum@fastmail.fm> | 2008-10-22 06:00:09 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-22 08:00:23 -0400 |
commit | 874d93d11823b2b861addac6a5dc31162e924ab2 (patch) | |
tree | 6d84df0b35ca810ea5871be766934b0b20ad70b7 /arch/x86/kernel/dumpstack_32.c | |
parent | b4b8f87bf4958cbad620654efc0882ac46c19846 (diff) |
x86, dumpstack: let signr=0 signal no do_exit
Change oops_end such that signr=0 signals that do_exit
is not to be called.
Currently, each use of __die is soon followed by a call
to oops_end and 'regs' is set to NULL if oops_end is expected
not to call do_exit. Change all such pairs to set signr=0
instead. On x86_64 oops_end is used 'bare' in die_nmi; use
signr=0 instead of regs=NULL there, too.
Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/dumpstack_32.c')
-rw-r--r-- | arch/x86/kernel/dumpstack_32.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index 5493d31be4e5..7c22f99f0efb 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
@@ -318,7 +318,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr) | |||
318 | __raw_spin_unlock(&die_lock); | 318 | __raw_spin_unlock(&die_lock); |
319 | raw_local_irq_restore(flags); | 319 | raw_local_irq_restore(flags); |
320 | 320 | ||
321 | if (!regs) | 321 | if (!signr) |
322 | return; | 322 | return; |
323 | 323 | ||
324 | if (in_interrupt()) | 324 | if (in_interrupt()) |
@@ -371,17 +371,18 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err) | |||
371 | void die(const char *str, struct pt_regs *regs, long err) | 371 | void die(const char *str, struct pt_regs *regs, long err) |
372 | { | 372 | { |
373 | unsigned long flags = oops_begin(); | 373 | unsigned long flags = oops_begin(); |
374 | int sig = SIGSEGV; | ||
374 | 375 | ||
375 | if (die_nest_count < 3) { | 376 | if (die_nest_count < 3) { |
376 | report_bug(regs->ip, regs); | 377 | report_bug(regs->ip, regs); |
377 | 378 | ||
378 | if (__die(str, regs, err)) | 379 | if (__die(str, regs, err)) |
379 | regs = NULL; | 380 | sig = 0; |
380 | } else { | 381 | } else { |
381 | printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); | 382 | printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); |
382 | } | 383 | } |
383 | 384 | ||
384 | oops_end(flags, regs, SIGSEGV); | 385 | oops_end(flags, regs, sig); |
385 | } | 386 | } |
386 | 387 | ||
387 | static DEFINE_SPINLOCK(nmi_print_lock); | 388 | static DEFINE_SPINLOCK(nmi_print_lock); |