aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/kernel.h
diff options
context:
space:
mode:
authorHidehiro Kawai <hidehiro.kawai.ez@hitachi.com>2016-03-22 17:27:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-03-22 18:36:02 -0400
commitebc41f20d77f6ad91f1f2d2af5147dc9bb6b5eea (patch)
tree60550da4896b285024c4fa1467ddeb052413ddc5 /include/linux/kernel.h
parenta484c3dd9426e1f450c7ed8ad5a2002ea1b309ea (diff)
panic: change nmi_panic from macro to function
Commit 1717f2096b54 ("panic, x86: Fix re-entrance problem due to panic on NMI") and commit 58c5661f2144 ("panic, x86: Allow CPUs to save registers even if looping in NMI context") introduced nmi_panic() which prevents concurrent/recursive execution of panic(). It also saves registers for the crash dump on x86. However, there are some cases where NMI handlers still use panic(). This patch set partially replaces them with nmi_panic() in those cases. Even this patchset is applied, some NMI or similar handlers (e.g. MCE handler) continue to use panic(). This is because I can't test them well and actual problems won't happen. For example, the possibility that normal panic and panic on MCE happen simultaneously is very low. This patch (of 3): Convert nmi_panic() to a proper function and export it instead of exporting internal implementation details to modules, for obvious reasons. Signed-off-by: Hidehiro Kawai <hidehiro.kawai.ez@hitachi.com> Acked-by: Borislav Petkov <bp@suse.de> Acked-by: Michal Nazarewicz <mina86@mina86.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk> Cc: Nicolas Iooss <nicolas.iooss_linux@m4x.org> Cc: Javi Merino <javi.merino@arm.com> Cc: Gobinda Charan Maji <gobinda.cemk07@gmail.com> Cc: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vitaly Kuznetsov <vkuznets@redhat.com> Cc: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com> Cc: Tejun Heo <tj@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/kernel.h')
-rw-r--r--include/linux/kernel.h21
1 files changed, 1 insertions, 20 deletions
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index b82646ee70eb..a13c52ccd8ac 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -255,7 +255,7 @@ extern long (*panic_blink)(int state);
255__printf(1, 2) 255__printf(1, 2)
256void panic(const char *fmt, ...) 256void panic(const char *fmt, ...)
257 __noreturn __cold; 257 __noreturn __cold;
258void nmi_panic_self_stop(struct pt_regs *); 258void nmi_panic(struct pt_regs *regs, const char *msg);
259extern void oops_enter(void); 259extern void oops_enter(void);
260extern void oops_exit(void); 260extern void oops_exit(void);
261void print_oops_end_marker(void); 261void print_oops_end_marker(void);
@@ -457,25 +457,6 @@ extern atomic_t panic_cpu;
457#define PANIC_CPU_INVALID -1 457#define PANIC_CPU_INVALID -1
458 458
459/* 459/*
460 * A variant of panic() called from NMI context. We return if we've already
461 * panicked on this CPU. If another CPU already panicked, loop in
462 * nmi_panic_self_stop() which can provide architecture dependent code such
463 * as saving register state for crash dump.
464 */
465#define nmi_panic(regs, fmt, ...) \
466do { \
467 int old_cpu, cpu; \
468 \
469 cpu = raw_smp_processor_id(); \
470 old_cpu = atomic_cmpxchg(&panic_cpu, PANIC_CPU_INVALID, cpu); \
471 \
472 if (old_cpu == PANIC_CPU_INVALID) \
473 panic(fmt, ##__VA_ARGS__); \
474 else if (old_cpu != cpu) \
475 nmi_panic_self_stop(regs); \
476} while (0)
477
478/*
479 * Only to be used by arch init code. If the user over-wrote the default 460 * Only to be used by arch init code. If the user over-wrote the default
480 * CONFIG_PANIC_TIMEOUT, honor it. 461 * CONFIG_PANIC_TIMEOUT, honor it.
481 */ 462 */