* [PATCH 0/9] panic: introduce panic status function family @ 2025-08-20 9:14 Jinchao Wang 2025-08-20 9:14 ` [PATCH 1/9] panic: Introduce helper functions for panic state Jinchao Wang 0 siblings, 1 reply; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm Cc: linux-kernel, feng.tang, joel.granados, john.ogness, wangjinchao600, namcao, sravankumarlpu This series introduces a family of helper functions to manage panic state and updates existing code to use them. Before this series, panic state helpers were scattered and inconsistent. For example, panic_in_progress() was defined in printk/printk.c, not in panic.c or panic.h. As a result, developers had to look in unexpected places to understand or re-use panic state logic. Other checks were open- coded, duplicating logic across panic, crash, and watchdog paths. The new helpers centralize the functionality in panic.c/panic.h: - panic_try_start() - panic_reset() - panic_in_progress() - panic_on_this_cpu() - panic_on_other_cpu() Patches 1–8 add the helpers and convert panic/crash and printk/nbcon code to use them. Patch 9 fixes a bug in the watchdog subsystem by skipping checks when a panic is in progress, avoiding interference with the panic CPU. Together, this makes panic state handling simpler, more discoverable, and more robust. Jinchao Wang (9): panic: Introduce helper functions for panic state fbdev: Use panic_in_progress() helper crash_core: use panic_try_start() in crash_kexec() panic: use panic_try_start() in nmi_panic() panic: use panic_try_start() in vpanic() printk/nbcon: use panic_on_this_cpu() helper panic/printk: replace this_cpu_in_panic() with panic_on_this_cpu() panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() watchdog: skip checks when panic is in progress drivers/video/fbdev/core/fbcon.c | 9 +--- include/linux/panic.h | 6 +++ include/linux/printk.h | 2 - kernel/crash_core.c | 15 ++----- kernel/panic.c | 71 +++++++++++++++++++++++++------ kernel/printk/internal.h | 1 - kernel/printk/nbcon.c | 14 +++--- kernel/printk/printk.c | 37 +++------------- kernel/printk/printk_ringbuffer.c | 2 +- kernel/watchdog_buddy.c | 5 +++ kernel/watchdog_perf.c | 3 ++ lib/dump_stack.c | 2 +- 12 files changed, 89 insertions(+), 78 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/9] panic: Introduce helper functions for panic state 2025-08-20 9:14 [PATCH 0/9] panic: introduce panic status function family Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Jinchao Wang 0 siblings, 1 reply; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Steven Rostedt, John Ogness, Sergey Senozhatsky, Luis Chamberlain, Joel Granados, Peter Zijlstra (Intel), Joel Fernandes, Jinchao Wang, Jason Gunthorpe, Sohil Mehta, Nam Cao, Feng Tang, Sravan Kumar Gundu Cc: linux-kernel, Kees Cook, Ingo Molnar, Dave Jiang This patch introduces four new helper functions to abstract the management of the panic_cpu variable. These functions will be used in subsequent patches to refactor existing code. The direct use of panic_cpu can be error-prone and ambiguous, as it requires manual checks to determine which CPU is handling the panic. The new helpers clarify intent: panic_try_start(): Atomically sets the current CPU as the panicking CPU. panic_reset(): Reset panic_cpu to PANIC_CPU_INVALID. panic_in_progress(): Checks if a panic has been triggered. panic_on_this_cpu(): Returns true if the current CPU is the panic originator. panic_on_other_cpu(): Returns true if a panic is on another CPU. This change lays the groundwork for improved code readability and robustness in the panic handling subsystem. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- include/linux/panic.h | 6 +++++ kernel/panic.c | 53 ++++++++++++++++++++++++++++++++++++++++++ kernel/printk/printk.c | 5 ---- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/include/linux/panic.h b/include/linux/panic.h index 7be742628c25..6f972a66c13e 100644 --- a/include/linux/panic.h +++ b/include/linux/panic.h @@ -43,6 +43,12 @@ void abort(void); extern atomic_t panic_cpu; #define PANIC_CPU_INVALID -1 +bool panic_try_start(void); +void panic_reset(void); +bool panic_in_progress(void); +bool panic_on_this_cpu(void); +bool panic_on_other_cpu(void); + /* * Only to be used by arch init code. If the user over-wrote the default * CONFIG_PANIC_TIMEOUT, honor it. diff --git a/kernel/panic.c b/kernel/panic.c index 72fcbb5a071b..eacb0c972110 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -294,6 +294,59 @@ void __weak crash_smp_send_stop(void) atomic_t panic_cpu = ATOMIC_INIT(PANIC_CPU_INVALID); +bool panic_try_start(void) +{ + int old_cpu, this_cpu; + + /* + * Only one CPU is allowed to execute the crash_kexec() code as with + * panic(). Otherwise parallel calls of panic() and crash_kexec() + * may stop each other. To exclude them, we use panic_cpu here too. + */ + old_cpu = PANIC_CPU_INVALID; + this_cpu = raw_smp_processor_id(); + + return atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu); +} +EXPORT_SYMBOL(panic_try_start); + +void panic_reset(void) +{ + atomic_set(&panic_cpu, PANIC_CPU_INVALID); +} +EXPORT_SYMBOL(panic_reset); + +bool panic_in_progress(void) +{ + return unlikely(atomic_read(&panic_cpu) != PANIC_CPU_INVALID); +} +EXPORT_SYMBOL(panic_in_progress); + +/* Return true if a panic is in progress on the current CPU. */ +bool panic_on_this_cpu(void) +{ + /* + * We can use raw_smp_processor_id() here because it is impossible for + * the task to be migrated to the panic_cpu, or away from it. If + * panic_cpu has already been set, and we're not currently executing on + * that CPU, then we never will be. + */ + return unlikely(atomic_read(&panic_cpu) == raw_smp_processor_id()); +} +EXPORT_SYMBOL(panic_on_this_cpu); + +/* + * Return true if a panic is in progress on a remote CPU. + * + * On true, the local CPU should immediately release any printing resources + * that may be needed by the panic CPU. + */ +bool panic_on_other_cpu(void) +{ + return (panic_in_progress() && !this_cpu_in_panic()); +} +EXPORT_SYMBOL(panic_on_other_cpu); + /* * 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 diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 0efbcdda9aab..5fe35f377b79 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -345,11 +345,6 @@ static void __up_console_sem(unsigned long ip) } #define up_console_sem() __up_console_sem(_RET_IP_) -static bool panic_in_progress(void) -{ - return unlikely(atomic_read(&panic_cpu) != PANIC_CPU_INVALID); -} - /* Return true if a panic is in progress on the current CPU. */ bool this_cpu_in_panic(void) { -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/9] fbdev: Use panic_in_progress() helper 2025-08-20 9:14 ` [PATCH 1/9] panic: Introduce helper functions for panic state Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Jinchao Wang 2025-08-20 10:44 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Qianqiang Liu 0 siblings, 2 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Simona Vetter, Helge Deller, Thomas Zimmermann, Ville Syrjälä, Qianqiang Liu, Shixiong Ou, Jinchao Wang, Sravan Kumar Gundu, Zsolt Kajtar, Kees Cook Cc: linux-kernel, feng.tang, joel.granados, john.ogness, namcao, linux-fbdev, dri-devel This patch updates the fbcon_skip_panic() function to use the panic_in_progress() helper. The previous direct access to panic_cpu is less readable and is being replaced by a dedicated function that more clearly expresses the intent. This change is part of a series to refactor the kernel's panic handling logic for better clarity and robustness. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- drivers/video/fbdev/core/fbcon.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 55f5731e94c3..b062b05f4128 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -279,14 +279,7 @@ static int fbcon_get_rotate(struct fb_info *info) static bool fbcon_skip_panic(struct fb_info *info) { -/* panic_cpu is not exported, and can't be used if built as module. Use - * oops_in_progress instead, but non-fatal oops won't be printed. - */ -#if defined(MODULE) - return (info->skip_panic && unlikely(oops_in_progress)); -#else - return (info->skip_panic && unlikely(atomic_read(&panic_cpu) != PANIC_CPU_INVALID)); -#endif + return (info->skip_panic && unlikely(panic_in_progress())); } static inline bool fbcon_is_active(struct vc_data *vc, struct fb_info *info) -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() 2025-08-20 9:14 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 4/9] panic: use panic_try_start() in nmi_panic() Jinchao Wang ` (2 more replies) 2025-08-20 10:44 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Qianqiang Liu 1 sibling, 3 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Baoquan He, Vivek Goyal, Dave Young Cc: linux-kernel, feng.tang, joel.granados, john.ogness, wangjinchao600, namcao, sravankumarlpu, kexec crash_kexec() had its own code to exclude parallel execution by setting panic_cpu. This is already handled by panic_try_start(). Switch to panic_try_start() to remove the duplication and keep the logic consistent. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- kernel/crash_core.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/kernel/crash_core.c b/kernel/crash_core.c index a4ef79591eb2..bb38bbaf3a26 100644 --- a/kernel/crash_core.c +++ b/kernel/crash_core.c @@ -4,6 +4,7 @@ * Copyright (C) 2002-2004 Eric Biederman <ebiederm@xmission.com> */ +#include "linux/panic.h" #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/buildid.h> @@ -143,17 +144,7 @@ STACK_FRAME_NON_STANDARD(__crash_kexec); __bpf_kfunc void crash_kexec(struct pt_regs *regs) { - int old_cpu, this_cpu; - - /* - * Only one CPU is allowed to execute the crash_kexec() code as with - * panic(). Otherwise parallel calls of panic() and crash_kexec() - * may stop each other. To exclude them, we use panic_cpu here too. - */ - old_cpu = PANIC_CPU_INVALID; - this_cpu = raw_smp_processor_id(); - - if (atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu)) { + if (panic_try_start()) { /* This is the 1st CPU which comes here, so go ahead. */ __crash_kexec(regs); @@ -161,7 +152,7 @@ __bpf_kfunc void crash_kexec(struct pt_regs *regs) * Reset panic_cpu to allow another panic()/crash_kexec() * call. */ - atomic_set(&panic_cpu, PANIC_CPU_INVALID); + panic_reset(); } } -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/9] panic: use panic_try_start() in nmi_panic() 2025-08-20 9:14 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 5/9] panic: use panic_try_start() in vpanic() Jinchao Wang 2025-08-20 13:35 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Baoquan He 2025-08-21 2:43 ` Baoquan He 2 siblings, 1 reply; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Feng Tang, John Ogness, Joel Granados, Jinchao Wang, Nam Cao, Sravan Kumar Gundu Cc: linux-kernel nmi_panic() duplicated the logic to claim panic_cpu with atomic_try_cmpxchg. This is already wrapped in panic_try_start(). Replace the open-coded logic with panic_try_start(), and use panic_on_other_cpu() for the fallback path. This removes duplication and keeps panic handling code consistent. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- kernel/panic.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/kernel/panic.c b/kernel/panic.c index eacb0c972110..cd86d37d124c 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -355,15 +355,9 @@ EXPORT_SYMBOL(panic_on_other_cpu); */ void nmi_panic(struct pt_regs *regs, const char *msg) { - int old_cpu, this_cpu; - - old_cpu = PANIC_CPU_INVALID; - this_cpu = raw_smp_processor_id(); - - /* atomic_try_cmpxchg updates old_cpu on failure */ - if (atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu)) + if (panic_try_start()) panic("%s", msg); - else if (old_cpu != this_cpu) + else if (panic_on_other_cpu()) nmi_panic_self_stop(regs); } EXPORT_SYMBOL(nmi_panic); -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/9] panic: use panic_try_start() in vpanic() 2025-08-20 9:14 ` [PATCH 4/9] panic: use panic_try_start() in nmi_panic() Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper Jinchao Wang 0 siblings, 1 reply; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Feng Tang, John Ogness, Jinchao Wang, Joel Granados, Nam Cao, Sravan Kumar Gundu Cc: linux-kernel vpanic() had open-coded logic to claim panic_cpu with atomic_try_cmpxchg. This is already handled by panic_try_start(). Switch to panic_try_start() and use panic_on_other_cpu() for the fallback path. This removes duplicate code and makes panic handling consistent across functions. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- kernel/panic.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/kernel/panic.c b/kernel/panic.c index cd86d37d124c..5266e195f5ac 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -415,7 +415,6 @@ void vpanic(const char *fmt, va_list args) static char buf[1024]; long i, i_next = 0, len; int state = 0; - int old_cpu, this_cpu; bool _crash_kexec_post_notifiers = crash_kexec_post_notifiers; if (panic_on_warn) { @@ -452,13 +451,10 @@ void vpanic(const char *fmt, va_list args) * `old_cpu == this_cpu' means we came from nmi_panic() which sets * panic_cpu to this CPU. In this case, this is also the 1st CPU. */ - old_cpu = PANIC_CPU_INVALID; - this_cpu = raw_smp_processor_id(); - /* atomic_try_cmpxchg updates old_cpu on failure */ - if (atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu)) { + if (panic_try_start()) { /* go ahead */ - } else if (old_cpu != this_cpu) + } else if (panic_on_other_cpu()) panic_smp_self_stop(); console_verbose(); -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper 2025-08-20 9:14 ` [PATCH 5/9] panic: use panic_try_start() in vpanic() Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 7/9] panic/printk: replace this_cpu_in_panic() with panic_on_this_cpu() Jinchao Wang 2025-08-25 9:53 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper John Ogness 0 siblings, 2 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Steven Rostedt, John Ogness, Sergey Senozhatsky Cc: linux-kernel, feng.tang, joel.granados, wangjinchao600, namcao, sravankumarlpu nbcon_context_try_acquire() compared panic_cpu directly with smp_processor_id(). This open-coded check is now provided by panic_on_this_cpu(). Switch to panic_on_this_cpu() to simplify the code and improve readability. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- kernel/printk/nbcon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c index 646801813415..7490865e2f44 100644 --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -2,6 +2,7 @@ // Copyright (C) 2022 Linutronix GmbH, John Ogness // Copyright (C) 2022 Intel, Thomas Gleixner +#include "linux/panic.h" #include <linux/atomic.h> #include <linux/bug.h> #include <linux/console.h> @@ -589,7 +590,6 @@ static struct printk_buffers panic_nbcon_pbufs; */ static bool nbcon_context_try_acquire(struct nbcon_context *ctxt, bool is_reacquire) { - unsigned int cpu = smp_processor_id(); struct console *con = ctxt->console; struct nbcon_state cur; int err; @@ -614,7 +614,7 @@ static bool nbcon_context_try_acquire(struct nbcon_context *ctxt, bool is_reacqu /* Acquire succeeded. */ /* Assign the appropriate buffer for this context. */ - if (atomic_read(&panic_cpu) == cpu) + if (panic_on_this_cpu()) ctxt->pbufs = &panic_nbcon_pbufs; else ctxt->pbufs = con->pbufs; -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 7/9] panic/printk: replace this_cpu_in_panic() with panic_on_this_cpu() 2025-08-20 9:14 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() Jinchao Wang 2025-08-25 9:53 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper John Ogness 1 sibling, 1 reply; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Steven Rostedt, John Ogness, Sergey Senozhatsky, Feng Tang, Joel Granados, Jinchao Wang, Nam Cao, Sravan Kumar Gundu Cc: linux-kernel The helper this_cpu_in_panic() duplicated logic already provided by panic_on_this_cpu(). Remove this_cpu_in_panic() and switch all users to panic_on_this_cpu(). This simplifies the code and avoids having two helpers for the same check. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- include/linux/printk.h | 2 -- kernel/panic.c | 2 +- kernel/printk/nbcon.c | 2 +- kernel/printk/printk.c | 15 ++------------- kernel/printk/printk_ringbuffer.c | 2 +- lib/dump_stack.c | 2 +- 6 files changed, 6 insertions(+), 19 deletions(-) diff --git a/include/linux/printk.h b/include/linux/printk.h index 5d22b803f51e..45c663124c9b 100644 --- a/include/linux/printk.h +++ b/include/linux/printk.h @@ -330,8 +330,6 @@ static inline bool pr_flush(int timeout_ms, bool reset_on_progress) #endif -bool this_cpu_in_panic(void); - #ifdef CONFIG_SMP extern int __printk_cpu_sync_try_get(void); extern void __printk_cpu_sync_wait(void); diff --git a/kernel/panic.c b/kernel/panic.c index 5266e195f5ac..8415e4073da1 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -343,7 +343,7 @@ EXPORT_SYMBOL(panic_on_this_cpu); */ bool panic_on_other_cpu(void) { - return (panic_in_progress() && !this_cpu_in_panic()); + return (panic_in_progress() && !panic_on_this_cpu()); } EXPORT_SYMBOL(panic_on_other_cpu); diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c index 7490865e2f44..c6d1a4a747e9 100644 --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -1394,7 +1394,7 @@ enum nbcon_prio nbcon_get_default_prio(void) { unsigned int *cpu_emergency_nesting; - if (this_cpu_in_panic()) + if (panic_on_this_cpu()) return NBCON_PRIO_PANIC; cpu_emergency_nesting = nbcon_get_cpu_emergency_nesting(); diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 5fe35f377b79..faa8b1f0585b 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -17,6 +17,7 @@ * 01Mar01 Andrew Morton */ +#include "linux/panic.h" #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/kernel.h> @@ -345,18 +346,6 @@ static void __up_console_sem(unsigned long ip) } #define up_console_sem() __up_console_sem(_RET_IP_) -/* Return true if a panic is in progress on the current CPU. */ -bool this_cpu_in_panic(void) -{ - /* - * We can use raw_smp_processor_id() here because it is impossible for - * the task to be migrated to the panic_cpu, or away from it. If - * panic_cpu has already been set, and we're not currently executing on - * that CPU, then we never will be. - */ - return unlikely(atomic_read(&panic_cpu) == raw_smp_processor_id()); -} - /* * Return true if a panic is in progress on a remote CPU. * @@ -365,7 +354,7 @@ bool this_cpu_in_panic(void) */ bool other_cpu_in_panic(void) { - return (panic_in_progress() && !this_cpu_in_panic()); + return (panic_in_progress() && !panic_on_this_cpu()); } /* diff --git a/kernel/printk/printk_ringbuffer.c b/kernel/printk/printk_ringbuffer.c index d9fb053cff67..e2a1b2d34d2b 100644 --- a/kernel/printk/printk_ringbuffer.c +++ b/kernel/printk/printk_ringbuffer.c @@ -2143,7 +2143,7 @@ static bool _prb_read_valid(struct printk_ringbuffer *rb, u64 *seq, * But it would have the sequence number returned * by "prb_next_reserve_seq() - 1". */ - if (this_cpu_in_panic() && + if (panic_on_this_cpu() && (!debug_non_panic_cpus || legacy_allow_panic_sync) && ((*seq + 1) < prb_next_reserve_seq(rb))) { (*seq)++; diff --git a/lib/dump_stack.c b/lib/dump_stack.c index b3a85fe8b673..f0c78b5b5324 100644 --- a/lib/dump_stack.c +++ b/lib/dump_stack.c @@ -102,7 +102,7 @@ static void __dump_stack(const char *log_lvl) */ asmlinkage __visible void dump_stack_lvl(const char *log_lvl) { - bool in_panic = this_cpu_in_panic(); + bool in_panic = panic_on_this_cpu(); unsigned long flags; /* -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() 2025-08-20 9:14 ` [PATCH 7/9] panic/printk: replace this_cpu_in_panic() with panic_on_this_cpu() Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 9:14 ` [PATCH 9/9] watchdog: skip checks when panic is in progress Jinchao Wang 2025-08-25 10:05 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() John Ogness 0 siblings, 2 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Steven Rostedt, John Ogness, Sergey Senozhatsky Cc: linux-kernel, feng.tang, joel.granados, wangjinchao600, namcao, sravankumarlpu The helper other_cpu_in_panic() duplicated logic already provided by panic_on_other_cpu(). Remove other_cpu_in_panic() and update all users to call panic_on_other_cpu() instead. This removes redundant code and makes panic handling consistent. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- kernel/printk/internal.h | 1 - kernel/printk/nbcon.c | 8 ++++---- kernel/printk/printk.c | 19 ++++--------------- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h index ef282001f200..f72bbfa266d6 100644 --- a/kernel/printk/internal.h +++ b/kernel/printk/internal.h @@ -332,7 +332,6 @@ struct printk_message { unsigned long dropped; }; -bool other_cpu_in_panic(void); bool printk_get_next_message(struct printk_message *pmsg, u64 seq, bool is_extended, bool may_supress); diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c index c6d1a4a747e9..171480135830 100644 --- a/kernel/printk/nbcon.c +++ b/kernel/printk/nbcon.c @@ -255,7 +255,7 @@ static int nbcon_context_try_acquire_direct(struct nbcon_context *ctxt, * opportunity to perform any necessary cleanup if they were * interrupted by the panic CPU while printing. */ - if (other_cpu_in_panic() && + if (panic_on_other_cpu() && (!is_reacquire || cur->unsafe_takeover)) { return -EPERM; } @@ -310,7 +310,7 @@ static bool nbcon_waiter_matches(struct nbcon_state *cur, int expected_prio) * Event #2 implies the new context is PANIC. * Event #3 occurs when panic() has flushed the console. * Event #4 occurs when a non-panic CPU reacquires. - * Event #5 is not possible due to the other_cpu_in_panic() check + * Event #5 is not possible due to the panic_on_other_cpu() check * in nbcon_context_try_acquire_handover(). */ @@ -349,7 +349,7 @@ static int nbcon_context_try_acquire_requested(struct nbcon_context *ctxt, struct nbcon_state new; /* Note that the caller must still remove the request! */ - if (other_cpu_in_panic()) + if (panic_on_other_cpu()) return -EPERM; /* @@ -447,7 +447,7 @@ static int nbcon_context_try_acquire_handover(struct nbcon_context *ctxt, * nbcon_waiter_matches(). In particular, the assumption that * lower priorities are ignored during panic. */ - if (other_cpu_in_panic()) + if (panic_on_other_cpu()) return -EPERM; /* Handover is not possible on the same CPU. */ diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index faa8b1f0585b..236f03937107 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -346,17 +346,6 @@ static void __up_console_sem(unsigned long ip) } #define up_console_sem() __up_console_sem(_RET_IP_) -/* - * Return true if a panic is in progress on a remote CPU. - * - * On true, the local CPU should immediately release any printing resources - * that may be needed by the panic CPU. - */ -bool other_cpu_in_panic(void) -{ - return (panic_in_progress() && !panic_on_this_cpu()); -} - /* * This is used for debugging the mess that is the VT code by * keeping track if we have the console semaphore held. It's @@ -2391,7 +2380,7 @@ asmlinkage int vprintk_emit(int facility, int level, * non-panic CPUs are generating any messages, they will be * silently dropped. */ - if (other_cpu_in_panic() && + if (panic_on_other_cpu() && !debug_non_panic_cpus && !panic_triggering_all_cpu_backtrace) return 0; @@ -2827,7 +2816,7 @@ void console_lock(void) might_sleep(); /* On panic, the console_lock must be left to the panic cpu. */ - while (other_cpu_in_panic()) + while (panic_on_other_cpu()) msleep(1000); down_console_sem(); @@ -2847,7 +2836,7 @@ EXPORT_SYMBOL(console_lock); int console_trylock(void) { /* On panic, the console_lock must be left to the panic cpu. */ - if (other_cpu_in_panic()) + if (panic_on_other_cpu()) return 0; if (down_trylock_console_sem()) return 0; @@ -3227,7 +3216,7 @@ static bool console_flush_all(bool do_cond_resched, u64 *next_seq, bool *handove any_progress = true; /* Allow panic_cpu to take over the consoles safely. */ - if (other_cpu_in_panic()) + if (panic_on_other_cpu()) goto abandon; if (do_cond_resched) -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 9/9] watchdog: skip checks when panic is in progress 2025-08-20 9:14 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() Jinchao Wang @ 2025-08-20 9:14 ` Jinchao Wang 2025-08-20 15:18 ` Yury Norov 2025-08-25 10:05 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() John Ogness 1 sibling, 1 reply; 20+ messages in thread From: Jinchao Wang @ 2025-08-20 9:14 UTC (permalink / raw) To: pmladek, akpm, Jinchao Wang, Yury Norov [NVIDIA], Douglas Anderson, Ingo Molnar, Li Huafei, Yicong Yang, Thorsten Blum Cc: linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, Will Deacon Both watchdog_buddy_check_hardlockup() and watchdog_overflow_callback() may trigger during a panic. This can lead to recursive panic handling. Add panic_in_progress() checks so watchdog activity is skipped once a panic has begun. This prevents recursive panic and keeps the panic path more reliable. Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> --- kernel/watchdog_buddy.c | 5 +++++ kernel/watchdog_perf.c | 3 +++ 2 files changed, 8 insertions(+) diff --git a/kernel/watchdog_buddy.c b/kernel/watchdog_buddy.c index ee754d767c21..79a85623028c 100644 --- a/kernel/watchdog_buddy.c +++ b/kernel/watchdog_buddy.c @@ -93,6 +93,11 @@ void watchdog_buddy_check_hardlockup(int hrtimer_interrupts) */ if (hrtimer_interrupts % 3 != 0) return; + /* + * pass the buddy check if a panic is in process + */ + if (panic_in_progress()) + return; /* check for a hardlockup on the next CPU */ next_cpu = watchdog_next_cpu(smp_processor_id()); diff --git a/kernel/watchdog_perf.c b/kernel/watchdog_perf.c index 9c58f5b4381d..7641de750ca5 100644 --- a/kernel/watchdog_perf.c +++ b/kernel/watchdog_perf.c @@ -12,6 +12,7 @@ #define pr_fmt(fmt) "NMI watchdog: " fmt +#include <linux/panic.h> #include <linux/nmi.h> #include <linux/atomic.h> #include <linux/module.h> @@ -110,6 +111,8 @@ static void watchdog_overflow_callback(struct perf_event *event, if (!watchdog_check_timestamp()) return; + if (panic_in_progress()) + return; watchdog_hardlockup_check(smp_processor_id(), regs); } -- 2.43.0 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 9/9] watchdog: skip checks when panic is in progress 2025-08-20 9:14 ` [PATCH 9/9] watchdog: skip checks when panic is in progress Jinchao Wang @ 2025-08-20 15:18 ` Yury Norov 2025-08-21 1:29 ` Jinchao Wang 0 siblings, 1 reply; 20+ messages in thread From: Yury Norov @ 2025-08-20 15:18 UTC (permalink / raw) To: Jinchao Wang Cc: pmladek, akpm, Douglas Anderson, Ingo Molnar, Li Huafei, Yicong Yang, Thorsten Blum, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, Will Deacon On Wed, Aug 20, 2025 at 05:14:54PM +0800, Jinchao Wang wrote: > Both watchdog_buddy_check_hardlockup() and > watchdog_overflow_callback() may trigger > during a panic. This can lead to recursive > panic handling. > > Add panic_in_progress() checks so watchdog > activity is skipped once a panic has begun. > > This prevents recursive panic and keeps the > panic path more reliable. > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> > --- > kernel/watchdog_buddy.c | 5 +++++ > kernel/watchdog_perf.c | 3 +++ > 2 files changed, 8 insertions(+) > > diff --git a/kernel/watchdog_buddy.c b/kernel/watchdog_buddy.c > index ee754d767c21..79a85623028c 100644 > --- a/kernel/watchdog_buddy.c > +++ b/kernel/watchdog_buddy.c > @@ -93,6 +93,11 @@ void watchdog_buddy_check_hardlockup(int hrtimer_interrupts) > */ > if (hrtimer_interrupts % 3 != 0) > return; > + /* > + * pass the buddy check if a panic is in process > + */ > + if (panic_in_progress()) > + return; > > /* check for a hardlockup on the next CPU */ > next_cpu = watchdog_next_cpu(smp_processor_id()); > diff --git a/kernel/watchdog_perf.c b/kernel/watchdog_perf.c > index 9c58f5b4381d..7641de750ca5 100644 > --- a/kernel/watchdog_perf.c > +++ b/kernel/watchdog_perf.c > @@ -12,6 +12,7 @@ > > #define pr_fmt(fmt) "NMI watchdog: " fmt > > +#include <linux/panic.h> > #include <linux/nmi.h> > #include <linux/atomic.h> > #include <linux/module.h> > @@ -110,6 +111,8 @@ static void watchdog_overflow_callback(struct perf_event *event, > > if (!watchdog_check_timestamp()) > return; > + if (panic_in_progress()) > + return; It looks like watchdog_check_timestamp() does some real work, like updates last_timestamp and so on. Under the panic condition all this may be unreliable, right? Maybe it's worth to make panic_in_progress() the first check in the chain? With that, Reviewed-by: Yury Norov (NVIDIA) <yury.norov@gmail.com> > > watchdog_hardlockup_check(smp_processor_id(), regs); > } > -- > 2.43.0 ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 9/9] watchdog: skip checks when panic is in progress 2025-08-20 15:18 ` Yury Norov @ 2025-08-21 1:29 ` Jinchao Wang 0 siblings, 0 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-21 1:29 UTC (permalink / raw) To: Yury Norov Cc: pmladek, akpm, Douglas Anderson, Ingo Molnar, Li Huafei, Yicong Yang, Thorsten Blum, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, Will Deacon On 8/20/25 23:18, Yury Norov wrote: > On Wed, Aug 20, 2025 at 05:14:54PM +0800, Jinchao Wang wrote: >> Both watchdog_buddy_check_hardlockup() and >> watchdog_overflow_callback() may trigger >> during a panic. This can lead to recursive >> panic handling. >> >> Add panic_in_progress() checks so watchdog >> activity is skipped once a panic has begun. >> >> This prevents recursive panic and keeps the >> panic path more reliable. >> >> Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> >> --- >> kernel/watchdog_buddy.c | 5 +++++ >> kernel/watchdog_perf.c | 3 +++ >> 2 files changed, 8 insertions(+) >> >> diff --git a/kernel/watchdog_buddy.c b/kernel/watchdog_buddy.c >> index ee754d767c21..79a85623028c 100644 >> --- a/kernel/watchdog_buddy.c >> +++ b/kernel/watchdog_buddy.c >> @@ -93,6 +93,11 @@ void watchdog_buddy_check_hardlockup(int hrtimer_interrupts) >> */ >> if (hrtimer_interrupts % 3 != 0) >> return; >> + /* >> + * pass the buddy check if a panic is in process >> + */ >> + if (panic_in_progress()) >> + return; >> >> /* check for a hardlockup on the next CPU */ >> next_cpu = watchdog_next_cpu(smp_processor_id()); >> diff --git a/kernel/watchdog_perf.c b/kernel/watchdog_perf.c >> index 9c58f5b4381d..7641de750ca5 100644 >> --- a/kernel/watchdog_perf.c >> +++ b/kernel/watchdog_perf.c >> @@ -12,6 +12,7 @@ >> >> #define pr_fmt(fmt) "NMI watchdog: " fmt >> >> +#include <linux/panic.h> >> #include <linux/nmi.h> >> #include <linux/atomic.h> >> #include <linux/module.h> >> @@ -110,6 +111,8 @@ static void watchdog_overflow_callback(struct perf_event *event, >> >> if (!watchdog_check_timestamp()) >> return; >> + if (panic_in_progress()) >> + return; > > It looks like watchdog_check_timestamp() does some real work, like > updates last_timestamp and so on. Under the panic condition all this > may be unreliable, right? > > Maybe it's worth to make panic_in_progress() the first check in the > chain? > That's a good point. Thank you. > With that, > > Reviewed-by: Yury Norov (NVIDIA) <yury.norov@gmail.com> > >> >> watchdog_hardlockup_check(smp_processor_id(), regs); >> } >> -- >> 2.43.0 -- Best regards, Jinchao ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() 2025-08-20 9:14 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() Jinchao Wang 2025-08-20 9:14 ` [PATCH 9/9] watchdog: skip checks when panic is in progress Jinchao Wang @ 2025-08-25 10:05 ` John Ogness 1 sibling, 0 replies; 20+ messages in thread From: John Ogness @ 2025-08-25 10:05 UTC (permalink / raw) To: Jinchao Wang, pmladek, akpm, Steven Rostedt, Sergey Senozhatsky Cc: linux-kernel, feng.tang, joel.granados, wangjinchao600, namcao, sravankumarlpu On 2025-08-20, Jinchao Wang <wangjinchao600@gmail.com> wrote: > The helper other_cpu_in_panic() duplicated > logic already provided by panic_on_other_cpu(). > > Remove other_cpu_in_panic() and update all > users to call panic_on_other_cpu() instead. > > This removes redundant code and makes panic > handling consistent. > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> Reviewed-by: John Ogness <john.ogness@linutronix.de> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper 2025-08-20 9:14 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper Jinchao Wang 2025-08-20 9:14 ` [PATCH 7/9] panic/printk: replace this_cpu_in_panic() with panic_on_this_cpu() Jinchao Wang @ 2025-08-25 9:53 ` John Ogness 2025-08-26 0:58 ` Jinchao Wang 1 sibling, 1 reply; 20+ messages in thread From: John Ogness @ 2025-08-25 9:53 UTC (permalink / raw) To: Jinchao Wang, pmladek, akpm, Steven Rostedt, Sergey Senozhatsky Cc: linux-kernel, feng.tang, joel.granados, wangjinchao600, namcao, sravankumarlpu On 2025-08-20, Jinchao Wang <wangjinchao600@gmail.com> wrote: > nbcon_context_try_acquire() compared > panic_cpu directly with smp_processor_id(). > This open-coded check is now provided by > panic_on_this_cpu(). > > Switch to panic_on_this_cpu() to simplify > the code and improve readability. > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> > --- > kernel/printk/nbcon.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c > index 646801813415..7490865e2f44 100644 > --- a/kernel/printk/nbcon.c > +++ b/kernel/printk/nbcon.c > @@ -2,6 +2,7 @@ > // Copyright (C) 2022 Linutronix GmbH, John Ogness > // Copyright (C) 2022 Intel, Thomas Gleixner > > +#include "linux/panic.h" > #include <linux/atomic.h> > #include <linux/bug.h> > #include <linux/console.h> Please use angle brackets. Also, the includes are sorted alphabetically. So it should look like this: #include <linux/irqflags.h> #include <linux/kthread.h> #include <linux/minmax.h> +#include <linux/panic.h> #include <linux/percpu.h> #include <linux/preempt.h> #include <linux/slab.h> > @@ -589,7 +590,6 @@ static struct printk_buffers panic_nbcon_pbufs; > */ > static bool nbcon_context_try_acquire(struct nbcon_context *ctxt, bool is_reacquire) > { > - unsigned int cpu = smp_processor_id(); > struct console *con = ctxt->console; > struct nbcon_state cur; > int err; > @@ -614,7 +614,7 @@ static bool nbcon_context_try_acquire(struct nbcon_context *ctxt, bool is_reacqu > /* Acquire succeeded. */ > > /* Assign the appropriate buffer for this context. */ > - if (atomic_read(&panic_cpu) == cpu) > + if (panic_on_this_cpu()) > ctxt->pbufs = &panic_nbcon_pbufs; > else > ctxt->pbufs = con->pbufs; With the above changes: Reviewed-by: John Ogness <john.ogness@linutronix.de> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper 2025-08-25 9:53 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper John Ogness @ 2025-08-26 0:58 ` Jinchao Wang 0 siblings, 0 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-26 0:58 UTC (permalink / raw) To: John Ogness, pmladek, akpm, Steven Rostedt, Sergey Senozhatsky Cc: linux-kernel, feng.tang, joel.granados, namcao, sravankumarlpu On 8/25/25 17:53, John Ogness wrote: > On 2025-08-20, Jinchao Wang <wangjinchao600@gmail.com> wrote: >> nbcon_context_try_acquire() compared >> panic_cpu directly with smp_processor_id(). >> This open-coded check is now provided by >> panic_on_this_cpu(). >> >> Switch to panic_on_this_cpu() to simplify >> the code and improve readability. >> >> Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> >> --- >> kernel/printk/nbcon.c | 4 ++-- >> 1 file changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c >> index 646801813415..7490865e2f44 100644 >> --- a/kernel/printk/nbcon.c >> +++ b/kernel/printk/nbcon.c >> @@ -2,6 +2,7 @@ >> // Copyright (C) 2022 Linutronix GmbH, John Ogness >> // Copyright (C) 2022 Intel, Thomas Gleixner >> >> +#include "linux/panic.h" >> #include <linux/atomic.h> >> #include <linux/bug.h> >> #include <linux/console.h> > > Please use angle brackets. Also, the includes are sorted > alphabetically. So it should look like this: > > #include <linux/irqflags.h> > #include <linux/kthread.h> > #include <linux/minmax.h> > +#include <linux/panic.h> > #include <linux/percpu.h> > #include <linux/preempt.h> > #include <linux/slab.h> > Thanks for the feedback. This patch, v2, has been merged to the -mm branch already, but I will fix the include style in a separate cleanup patch. -- Best regards, Jinchao ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() 2025-08-20 9:14 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Jinchao Wang 2025-08-20 9:14 ` [PATCH 4/9] panic: use panic_try_start() in nmi_panic() Jinchao Wang @ 2025-08-20 13:35 ` Baoquan He 2025-08-20 13:43 ` Baoquan He 2025-08-21 2:43 ` Baoquan He 2 siblings, 1 reply; 20+ messages in thread From: Baoquan He @ 2025-08-20 13:35 UTC (permalink / raw) To: Jinchao Wang Cc: pmladek, akpm, Vivek Goyal, Dave Young, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, kexec On 08/20/25 at 05:14pm, Jinchao Wang wrote: > crash_kexec() had its own code to exclude > parallel execution by setting panic_cpu. > This is already handled by panic_try_start(). > > Switch to panic_try_start() to remove the > duplication and keep the logic consistent. > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> > --- > kernel/crash_core.c | 15 +++------------ > 1 file changed, 3 insertions(+), 12 deletions(-) > > diff --git a/kernel/crash_core.c b/kernel/crash_core.c > index a4ef79591eb2..bb38bbaf3a26 100644 > --- a/kernel/crash_core.c > +++ b/kernel/crash_core.c > @@ -4,6 +4,7 @@ > * Copyright (C) 2002-2004 Eric Biederman <ebiederm@xmission.com> > */ > > +#include "linux/panic.h" > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > #include <linux/buildid.h> > @@ -143,17 +144,7 @@ STACK_FRAME_NON_STANDARD(__crash_kexec); > > __bpf_kfunc void crash_kexec(struct pt_regs *regs) > { > - int old_cpu, this_cpu; > - > - /* > - * Only one CPU is allowed to execute the crash_kexec() code as with > - * panic(). Otherwise parallel calls of panic() and crash_kexec() > - * may stop each other. To exclude them, we use panic_cpu here too. > - */ > - old_cpu = PANIC_CPU_INVALID; > - this_cpu = raw_smp_processor_id(); > - > - if (atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu)) { > + if (panic_try_start()) { Seriously, where can I find this panic_try_start() and the panic_reset()? > /* This is the 1st CPU which comes here, so go ahead. */ > __crash_kexec(regs); > > @@ -161,7 +152,7 @@ __bpf_kfunc void crash_kexec(struct pt_regs *regs) > * Reset panic_cpu to allow another panic()/crash_kexec() > * call. > */ > - atomic_set(&panic_cpu, PANIC_CPU_INVALID); > + panic_reset(); > } > } > > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() 2025-08-20 13:35 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Baoquan He @ 2025-08-20 13:43 ` Baoquan He 0 siblings, 0 replies; 20+ messages in thread From: Baoquan He @ 2025-08-20 13:43 UTC (permalink / raw) To: Jinchao Wang Cc: pmladek, akpm, Vivek Goyal, Dave Young, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, kexec On 08/20/25 at 09:35pm, Baoquan He wrote: > On 08/20/25 at 05:14pm, Jinchao Wang wrote: > > crash_kexec() had its own code to exclude > > parallel execution by setting panic_cpu. > > This is already handled by panic_try_start(). > > > > Switch to panic_try_start() to remove the > > duplication and keep the logic consistent. > > > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> > > --- > > kernel/crash_core.c | 15 +++------------ > > 1 file changed, 3 insertions(+), 12 deletions(-) > > > > diff --git a/kernel/crash_core.c b/kernel/crash_core.c > > index a4ef79591eb2..bb38bbaf3a26 100644 > > --- a/kernel/crash_core.c > > +++ b/kernel/crash_core.c > > @@ -4,6 +4,7 @@ > > * Copyright (C) 2002-2004 Eric Biederman <ebiederm@xmission.com> > > */ > > > > +#include "linux/panic.h" > > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > > > #include <linux/buildid.h> > > @@ -143,17 +144,7 @@ STACK_FRAME_NON_STANDARD(__crash_kexec); > > > > __bpf_kfunc void crash_kexec(struct pt_regs *regs) > > { > > - int old_cpu, this_cpu; > > - > > - /* > > - * Only one CPU is allowed to execute the crash_kexec() code as with > > - * panic(). Otherwise parallel calls of panic() and crash_kexec() > > - * may stop each other. To exclude them, we use panic_cpu here too. > > - */ > > - old_cpu = PANIC_CPU_INVALID; > > - this_cpu = raw_smp_processor_id(); > > - > > - if (atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu)) { > > + if (panic_try_start()) { > > Seriously, where can I find this panic_try_start() and the > panic_reset()? Ok, just found it's in a patch series. Grabbed the patchset and will have a look. > > > /* This is the 1st CPU which comes here, so go ahead. */ > > __crash_kexec(regs); > > > > @@ -161,7 +152,7 @@ __bpf_kfunc void crash_kexec(struct pt_regs *regs) > > * Reset panic_cpu to allow another panic()/crash_kexec() > > * call. > > */ > > - atomic_set(&panic_cpu, PANIC_CPU_INVALID); > > + panic_reset(); > > } > > } > > > > -- > > 2.43.0 > > > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() 2025-08-20 9:14 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Jinchao Wang 2025-08-20 9:14 ` [PATCH 4/9] panic: use panic_try_start() in nmi_panic() Jinchao Wang 2025-08-20 13:35 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Baoquan He @ 2025-08-21 2:43 ` Baoquan He 2025-08-21 3:41 ` Jinchao Wang 2 siblings, 1 reply; 20+ messages in thread From: Baoquan He @ 2025-08-21 2:43 UTC (permalink / raw) To: Jinchao Wang Cc: pmladek, akpm, Vivek Goyal, Dave Young, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, kexec On 08/20/25 at 05:14pm, Jinchao Wang wrote: > crash_kexec() had its own code to exclude > parallel execution by setting panic_cpu. > This is already handled by panic_try_start(). > > Switch to panic_try_start() to remove the > duplication and keep the logic consistent. > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> I had to use b4 to grab back the whole patchset, but I can't comment on other patches, especially the patch 1. Firstly, this series looks interesting. It does enhance code readibility. But I am a vim user, I like open code on this one line of code wrapping. So leave this to other reviewers to decide if this should be accepted. Secondly, the lines of your patch log are too short, it's not convenient for reading. Can you set your mail writer to change this. Thirdly, please add people to CC in all patches. I don't know why you only CC me in patch 3 if the whole patchset is related to crash and panic. Thanks Baoquan > --- > kernel/crash_core.c | 15 +++------------ > 1 file changed, 3 insertions(+), 12 deletions(-) > > diff --git a/kernel/crash_core.c b/kernel/crash_core.c > index a4ef79591eb2..bb38bbaf3a26 100644 > --- a/kernel/crash_core.c > +++ b/kernel/crash_core.c > @@ -4,6 +4,7 @@ > * Copyright (C) 2002-2004 Eric Biederman <ebiederm@xmission.com> > */ > > +#include "linux/panic.h" > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > #include <linux/buildid.h> > @@ -143,17 +144,7 @@ STACK_FRAME_NON_STANDARD(__crash_kexec); > > __bpf_kfunc void crash_kexec(struct pt_regs *regs) > { > - int old_cpu, this_cpu; > - > - /* > - * Only one CPU is allowed to execute the crash_kexec() code as with > - * panic(). Otherwise parallel calls of panic() and crash_kexec() > - * may stop each other. To exclude them, we use panic_cpu here too. > - */ > - old_cpu = PANIC_CPU_INVALID; > - this_cpu = raw_smp_processor_id(); > - > - if (atomic_try_cmpxchg(&panic_cpu, &old_cpu, this_cpu)) { > + if (panic_try_start()) { > /* This is the 1st CPU which comes here, so go ahead. */ > __crash_kexec(regs); > > @@ -161,7 +152,7 @@ __bpf_kfunc void crash_kexec(struct pt_regs *regs) > * Reset panic_cpu to allow another panic()/crash_kexec() > * call. > */ > - atomic_set(&panic_cpu, PANIC_CPU_INVALID); > + panic_reset(); > } > } > > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() 2025-08-21 2:43 ` Baoquan He @ 2025-08-21 3:41 ` Jinchao Wang 0 siblings, 0 replies; 20+ messages in thread From: Jinchao Wang @ 2025-08-21 3:41 UTC (permalink / raw) To: Baoquan He Cc: pmladek, akpm, Vivek Goyal, Dave Young, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, sravankumarlpu, kexec On 8/21/25 10:43, Baoquan He wrote: > On 08/20/25 at 05:14pm, Jinchao Wang wrote: >> crash_kexec() had its own code to exclude >> parallel execution by setting panic_cpu. >> This is already handled by panic_try_start(). >> >> Switch to panic_try_start() to remove the >> duplication and keep the logic consistent. >> >> Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> > > I had to use b4 to grab back the whole patchset, but I can't comment on > other patches, especially the patch 1. > > Firstly, this series looks interesting. It does enhance code > readibility. But I am a vim user, I like open code on this one line of > code wrapping. So leave this to other reviewers to decide if this should > be accepted. > > Secondly, the lines of your patch log are too short, it's not convenient > for reading. Can you set your mail writer to change this. > Thanks for the feedback. I will make sure to set my email client to use a wider line length for future patches. > Thirdly, please add people to CC in all patches. I don't know why you > only CC me in patch 3 if the whole patchset is related to crash and > panic. I use git send-email, which automatically adds the To and Cc headers based on these two configuration lines: tocmd = "scripts/get_maintainer.pl --norolestats --nol" ccCmd = "scripts/get_maintainer.pl --norolestats --nom" It seems this isn't working very well. I'll find another configuration for the toCmd/ccCmd. I would be very grateful if you could share your configuration or commands. -- Best regards, Jinchao ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/9] fbdev: Use panic_in_progress() helper 2025-08-20 9:14 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Jinchao Wang 2025-08-20 9:14 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Jinchao Wang @ 2025-08-20 10:44 ` Qianqiang Liu 1 sibling, 0 replies; 20+ messages in thread From: Qianqiang Liu @ 2025-08-20 10:44 UTC (permalink / raw) To: Jinchao Wang Cc: pmladek, akpm, Simona Vetter, Helge Deller, Thomas Zimmermann, Ville Syrjälä, Shixiong Ou, Sravan Kumar Gundu, Zsolt Kajtar, Kees Cook, linux-kernel, feng.tang, joel.granados, john.ogness, namcao, linux-fbdev, dri-devel On Wed, Aug 20, 2025 at 05:14:47PM +0800, Jinchao Wang wrote: > This patch updates the fbcon_skip_panic() function to use > the panic_in_progress() helper. > > The previous direct access to panic_cpu is less > readable and is being replaced by a dedicated function > that more clearly expresses the intent. > > This change is part of a series to refactor the kernel's > panic handling logic for better clarity and robustness. > > Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com> > --- > drivers/video/fbdev/core/fbcon.c | 9 +-------- > 1 file changed, 1 insertion(+), 8 deletions(-) > > diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c > index 55f5731e94c3..b062b05f4128 100644 > --- a/drivers/video/fbdev/core/fbcon.c > +++ b/drivers/video/fbdev/core/fbcon.c > @@ -279,14 +279,7 @@ static int fbcon_get_rotate(struct fb_info *info) > > static bool fbcon_skip_panic(struct fb_info *info) > { > -/* panic_cpu is not exported, and can't be used if built as module. Use > - * oops_in_progress instead, but non-fatal oops won't be printed. > - */ > -#if defined(MODULE) > - return (info->skip_panic && unlikely(oops_in_progress)); > -#else > - return (info->skip_panic && unlikely(atomic_read(&panic_cpu) != PANIC_CPU_INVALID)); > -#endif > + return (info->skip_panic && unlikely(panic_in_progress())); > } > > static inline bool fbcon_is_active(struct vc_data *vc, struct fb_info *info) > -- > 2.43.0 Acked-by Qianqiang Liu <qianqiang.liu@163.com> -- Best, Qianqiang Liu ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2025-08-26 0:58 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-08-20 9:14 [PATCH 0/9] panic: introduce panic status function family Jinchao Wang 2025-08-20 9:14 ` [PATCH 1/9] panic: Introduce helper functions for panic state Jinchao Wang 2025-08-20 9:14 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Jinchao Wang 2025-08-20 9:14 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Jinchao Wang 2025-08-20 9:14 ` [PATCH 4/9] panic: use panic_try_start() in nmi_panic() Jinchao Wang 2025-08-20 9:14 ` [PATCH 5/9] panic: use panic_try_start() in vpanic() Jinchao Wang 2025-08-20 9:14 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper Jinchao Wang 2025-08-20 9:14 ` [PATCH 7/9] panic/printk: replace this_cpu_in_panic() with panic_on_this_cpu() Jinchao Wang 2025-08-20 9:14 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() Jinchao Wang 2025-08-20 9:14 ` [PATCH 9/9] watchdog: skip checks when panic is in progress Jinchao Wang 2025-08-20 15:18 ` Yury Norov 2025-08-21 1:29 ` Jinchao Wang 2025-08-25 10:05 ` [PATCH 8/9] panic/printk: replace other_cpu_in_panic() with panic_on_other_cpu() John Ogness 2025-08-25 9:53 ` [PATCH 6/9] printk/nbcon: use panic_on_this_cpu() helper John Ogness 2025-08-26 0:58 ` Jinchao Wang 2025-08-20 13:35 ` [PATCH 3/9] crash_core: use panic_try_start() in crash_kexec() Baoquan He 2025-08-20 13:43 ` Baoquan He 2025-08-21 2:43 ` Baoquan He 2025-08-21 3:41 ` Jinchao Wang 2025-08-20 10:44 ` [PATCH 2/9] fbdev: Use panic_in_progress() helper Qianqiang Liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).