mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 05:31:08 -04:00
panic: change nmi_panic from macro to function
Commit1717f2096b("panic, x86: Fix re-entrance problem due to panic on NMI") and commit58c5661f21("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 <[email protected]> Acked-by: Borislav Petkov <[email protected]> Acked-by: Michal Nazarewicz <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Rasmus Villemoes <[email protected]> Cc: Nicolas Iooss <[email protected]> Cc: Javi Merino <[email protected]> Cc: Gobinda Charan Maji <[email protected]> Cc: "Steven Rostedt (Red Hat)" <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Vitaly Kuznetsov <[email protected]> Cc: HATAYAMA Daisuke <[email protected]> Cc: Tejun Heo <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
a484c3dd94
commit
ebc41f20d7
2 files changed
+21
-20
No files matched your search
@@ -73,6 +73,26 @@ void __weak nmi_panic_self_stop(struct pt_regs *regs)
|
||||
|
||||
atomic_t panic_cpu = ATOMIC_INIT(PANIC_CPU_INVALID);
|
||||
|
||||
/*
|
||||
* A variant of panic() called from NMI context. We return if we've already
|
||||
* panicked on this CPU. If another CPU already panicked, loop in
|
||||
* nmi_panic_self_stop() which can provide architecture dependent code such
|
||||
* as saving register state for crash dump.
|
||||
*/
|
||||
void nmi_panic(struct pt_regs *regs, const char *msg)
|
||||
{
|
||||
int old_cpu, cpu;
|
||||
|
||||
cpu = raw_smp_processor_id();
|
||||
old_cpu = atomic_cmpxchg(&panic_cpu, PANIC_CPU_INVALID, cpu);
|
||||
|
||||
if (old_cpu == PANIC_CPU_INVALID)
|
||||
panic("%s", msg);
|
||||
else if (old_cpu != cpu)
|
||||
nmi_panic_self_stop(regs);
|
||||
}
|
||||
EXPORT_SYMBOL(nmi_panic);
|
||||
|
||||
/**
|
||||
* panic - halt the system
|
||||
* @fmt: The text string to print
|
||||
|
||||
Reference in new issue
Block a user