All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt
@ 2026-06-20 22:01 Bradley Morgan
  2026-06-22  3:23 ` Feng Tang
  2026-06-23 12:37 ` Petr Mladek
  0 siblings, 2 replies; 6+ messages in thread
From: Bradley Morgan @ 2026-06-20 22:01 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Petr Mladek, Douglas Anderson, Mayank Rungta, Tejun Heo,
	Feng Tang, ZhenguoYao, Shengming Hu, Joel Granados, linux-kernel

The watchdog handles SYS_INFO_ALL_BT itself. When that is the only
watchdog specific bit, sys_info(0) falls back to kernel_sys_info.

Skip sys_info() for that case.

Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on system lockup")
Signed-off-by: Bradley Morgan <include@grrlz.net>
---
 kernel/watchdog.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 87dd5e0f6968..bad390a9b59e 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -54,6 +54,16 @@ static int __read_mostly watchdog_hardlockup_available;
 struct cpumask watchdog_cpumask __read_mostly;
 unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
 
+static void watchdog_sys_info(unsigned long si_mask)
+{
+	unsigned long dump_mask = si_mask & ~SYS_INFO_ALL_BT;
+
+	if (si_mask && !dump_mask)
+		return;
+
+	sys_info(dump_mask);
+}
+
 #ifdef CONFIG_HARDLOCKUP_DETECTOR
 
 # ifdef CONFIG_SMP
@@ -208,6 +218,7 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
 {
 	int hardlockup_all_cpu_backtrace;
 	unsigned int this_cpu;
+	unsigned long si_mask;
 	unsigned long flags;
 
 	if (per_cpu(watchdog_hardlockup_touched, cpu)) {
@@ -216,7 +227,8 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
 		return;
 	}
 
-	hardlockup_all_cpu_backtrace = (hardlockup_si_mask & SYS_INFO_ALL_BT) ?
+	si_mask = READ_ONCE(hardlockup_si_mask);
+	hardlockup_all_cpu_backtrace = (si_mask & SYS_INFO_ALL_BT) ?
 					1 : sysctl_hardlockup_all_cpu_backtrace;
 	/*
 	 * Check for a hardlockup by making sure the CPU's timer
@@ -286,7 +298,7 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
 			clear_bit_unlock(0, &hard_lockup_nmi_warn);
 	}
 
-	sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
+	watchdog_sys_info(si_mask);
 	if (hardlockup_panic)
 		nmi_panic(regs, "Hard LOCKUP");
 
@@ -798,6 +810,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
 	struct pt_regs *regs = get_irq_regs();
 	int softlockup_all_cpu_backtrace;
 	int duration, thresh_count;
+	unsigned long si_mask;
 	unsigned long flags;
 
 	if (!watchdog_enabled)
@@ -809,7 +822,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
 	if (panic_in_progress())
 		return HRTIMER_NORESTART;
 
-	softlockup_all_cpu_backtrace = (softlockup_si_mask & SYS_INFO_ALL_BT) ?
+	si_mask = READ_ONCE(softlockup_si_mask);
+	softlockup_all_cpu_backtrace = (si_mask & SYS_INFO_ALL_BT) ?
 					1 : sysctl_softlockup_all_cpu_backtrace;
 
 	watchdog_hardlockup_kick();
@@ -900,7 +914,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
 		}
 
 		add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
-		sys_info(softlockup_si_mask & ~SYS_INFO_ALL_BT);
+		watchdog_sys_info(si_mask);
 		thresh_count = duration / get_softlockup_thresh();
 
 		if (softlockup_panic && thresh_count >= softlockup_panic)
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt
  2026-06-20 22:01 [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt Bradley Morgan
@ 2026-06-22  3:23 ` Feng Tang
  2026-06-22  6:30   ` Bradley Morgan
  2026-06-23 12:37 ` Petr Mladek
  1 sibling, 1 reply; 6+ messages in thread
From: Feng Tang @ 2026-06-22  3:23 UTC (permalink / raw)
  To: Bradley Morgan
  Cc: Andrew Morton, Petr Mladek, Douglas Anderson, Mayank Rungta,
	Tejun Heo, ZhenguoYao, Shengming Hu, Joel Granados,
	Michael Ellerman, Madhavan Srinivasan, Nicholas Piggin,
	Christophe Leroy, linux-kernel

Hi,

On Sat, Jun 20, 2026 at 10:01:40PM +0000, Bradley Morgan wrote:
> The watchdog handles SYS_INFO_ALL_BT itself. When that is the only
> watchdog specific bit, sys_info(0) falls back to kernel_sys_info.
> 
> Skip sys_info() for that case.

Thanks for the patch!

I would explain some about he intention of the global 'kernel_sys_info'
which was suggested by Andrew. One use case is, for kernel stability
issues, it could be panic, soft/hard lockup, task-hung etc, and we now
have different conrol knobs for them each, but with similar 'xxx_sys_info'
capability, and they actually need similar system info like all-cpu
dump, blocked processes dump, debug ftrace dump, using one central
'kernel_sys_info' could be very handy by avoiding setting many knobs.
And for debugging random issues, you can just add sys_info(0)
everywhere,  and controll it by the existing 'kernel_si_mask'

btw, did you meet some issues with current code? If yes, could you
agive some more details ? IIUC, when 'kernel_si_mask' is not set
specifically, sys_info(0) is a nop. 

Thanks,
Feng
 
> Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on system lockup")
> Signed-off-by: Bradley Morgan <include@grrlz.net>
> ---
>  kernel/watchdog.c | 22 ++++++++++++++++++----
>  1 file changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/kernel/watchdog.c b/kernel/watchdog.c
> index 87dd5e0f6968..bad390a9b59e 100644
> --- a/kernel/watchdog.c
> +++ b/kernel/watchdog.c
> @@ -54,6 +54,16 @@ static int __read_mostly watchdog_hardlockup_available;
>  struct cpumask watchdog_cpumask __read_mostly;
>  unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
>  
> +static void watchdog_sys_info(unsigned long si_mask)
> +{
> +	unsigned long dump_mask = si_mask & ~SYS_INFO_ALL_BT;
> +
> +	if (si_mask && !dump_mask)
> +		return;
> +
> +	sys_info(dump_mask);
> +}
> +
>  #ifdef CONFIG_HARDLOCKUP_DETECTOR
>  
>  # ifdef CONFIG_SMP
> @@ -208,6 +218,7 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
>  {
>  	int hardlockup_all_cpu_backtrace;
>  	unsigned int this_cpu;
> +	unsigned long si_mask;
>  	unsigned long flags;
>  
>  	if (per_cpu(watchdog_hardlockup_touched, cpu)) {
> @@ -216,7 +227,8 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
>  		return;
>  	}
>  
> -	hardlockup_all_cpu_backtrace = (hardlockup_si_mask & SYS_INFO_ALL_BT) ?
> +	si_mask = READ_ONCE(hardlockup_si_mask);
> +	hardlockup_all_cpu_backtrace = (si_mask & SYS_INFO_ALL_BT) ?
>  					1 : sysctl_hardlockup_all_cpu_backtrace;
>  	/*
>  	 * Check for a hardlockup by making sure the CPU's timer
> @@ -286,7 +298,7 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
>  			clear_bit_unlock(0, &hard_lockup_nmi_warn);
>  	}
>  
> -	sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
> +	watchdog_sys_info(si_mask);
>  	if (hardlockup_panic)
>  		nmi_panic(regs, "Hard LOCKUP");
>  
> @@ -798,6 +810,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
>  	struct pt_regs *regs = get_irq_regs();
>  	int softlockup_all_cpu_backtrace;
>  	int duration, thresh_count;
> +	unsigned long si_mask;
>  	unsigned long flags;
>  
>  	if (!watchdog_enabled)
> @@ -809,7 +822,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
>  	if (panic_in_progress())
>  		return HRTIMER_NORESTART;
>  
> -	softlockup_all_cpu_backtrace = (softlockup_si_mask & SYS_INFO_ALL_BT) ?
> +	si_mask = READ_ONCE(softlockup_si_mask);
> +	softlockup_all_cpu_backtrace = (si_mask & SYS_INFO_ALL_BT) ?
>  					1 : sysctl_softlockup_all_cpu_backtrace;
>  
>  	watchdog_hardlockup_kick();
> @@ -900,7 +914,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
>  		}
>  
>  		add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
> -		sys_info(softlockup_si_mask & ~SYS_INFO_ALL_BT);
> +		watchdog_sys_info(si_mask);
>  		thresh_count = duration / get_softlockup_thresh();
>  
>  		if (softlockup_panic && thresh_count >= softlockup_panic)
> -- 
> 2.53.0

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt
  2026-06-22  3:23 ` Feng Tang
@ 2026-06-22  6:30   ` Bradley Morgan
  2026-06-22  7:37     ` Feng Tang
  0 siblings, 1 reply; 6+ messages in thread
From: Bradley Morgan @ 2026-06-22  6:30 UTC (permalink / raw)
  To: Feng Tang
  Cc: Andrew Morton, Petr Mladek, Douglas Anderson, Mayank Rungta,
	Tejun Heo, ZhenguoYao, Shengming Hu, Joel Granados,
	Michael Ellerman, Madhavan Srinivasan, Nicholas Piggin,
	Christophe Leroy, linux-kernel

On June 22, 2026 4:23:00 AM GMT+01:00, Feng Tang
<feng.tang@linux.alibaba.com> wrote:
>Hi,
>
>On Sat, Jun 20, 2026 at 10:01:40PM +0000, Bradley Morgan wrote:
>> The watchdog handles SYS_INFO_ALL_BT itself. When that is the only
>> watchdog specific bit, sys_info(0) falls back to kernel_sys_info.
>> 
>> Skip sys_info() for that case.
>
>Thanks for the patch!
>
>I would explain some about he intention of the global 'kernel_sys_info'
>which was suggested by Andrew. One use case is, for kernel stability
>issues, it could be panic, soft/hard lockup, task-hung etc, and we now
>have different conrol knobs for them each, but with similar 'xxx_sys_info'
>capability, and they actually need similar system info like all-cpu
>dump, blocked processes dump, debug ftrace dump, using one central
>'kernel_sys_info' could be very handy by avoiding setting many knobs.
>And for debugging random issues, you can just add sys_info(0)
>everywhere,  and controll it by the existing 'kernel_si_mask'
>
>btw, did you meet some issues with current code? If yes, could you
>agive some more details ? IIUC, when 'kernel_si_mask' is not set
>specifically, sys_info(0) is a nop. 
>
>Thanks,
>Feng

Feng!

I see what you are saying, but there is a "double ended sword"! :)

Unfortunately. The issue is where the watchdog specific mask is
explicitly set to ONLY all_bt for instance.

The watchdog only handles SYS_INFO_ALL_BT.

↓

so the later call becomes sys_info(0).

At that point sys_info() cannot tell that the caller had a nonzero
watchdog mask, and it falls back to kernel_sys_info.


Here is a example where this would be reached:

kernel.kernel_sys_info=tasks,mem kernel.hardlockup_sys_info=all_bt

a hard lockup still dumps tasks and memory through the global default.

I expected hardlockup_sys_info to override the global default once it
is explicitly set IMHO.

IF hardlockup_sys_info is empty..

This patch keeps the existing fallback! :)

So the **bug** is not sys_info(0) itself.

but the watchdog turning an explicit
all_bt ONLY mask into zero after handling all_bt locally.

What do you think Feng? Is this good to you? :)

Cheers!

>> Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on
>system lockup")
>> Signed-off-by: Bradley Morgan <include@grrlz.net>
>> ---
>>  kernel/watchdog.c | 22 ++++++++++++++++++----
>>  1 file changed, 18 insertions(+), 4 deletions(-)
>> 
>> diff --git a/kernel/watchdog.c b/kernel/watchdog.c
>> index 87dd5e0f6968..bad390a9b59e 100644
>> --- a/kernel/watchdog.c
>> +++ b/kernel/watchdog.c
>> @@ -54,6 +54,16 @@ static int __read_mostly
>watchdog_hardlockup_available;
>>  struct cpumask watchdog_cpumask __read_mostly;
>>  unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
>>  
>> +static void watchdog_sys_info(unsigned long si_mask)
>> +{
>> +	unsigned long dump_mask = si_mask & ~SYS_INFO_ALL_BT;
>> +
>> +	if (si_mask && !dump_mask)
>> +		return;
>> +
>> +	sys_info(dump_mask);
>> +}
>> +
>>  #ifdef CONFIG_HARDLOCKUP_DETECTOR
>>  
>>  # ifdef CONFIG_SMP
>> @@ -208,6 +218,7 @@ void watchdog_hardlockup_check(unsigned int cpu,
>struct pt_regs *regs)
>>  {
>>  	int hardlockup_all_cpu_backtrace;
>>  	unsigned int this_cpu;
>> +	unsigned long si_mask;
>>  	unsigned long flags;
>>  
>>  	if (per_cpu(watchdog_hardlockup_touched, cpu)) {
>> @@ -216,7 +227,8 @@ void watchdog_hardlockup_check(unsigned int cpu,
>struct pt_regs *regs)
>>  		return;
>>  	}
>>  
>> -	hardlockup_all_cpu_backtrace = (hardlockup_si_mask & SYS_INFO_ALL_BT) ?
>> +	si_mask = READ_ONCE(hardlockup_si_mask);
>> +	hardlockup_all_cpu_backtrace = (si_mask & SYS_INFO_ALL_BT) ?
>>  					1 : sysctl_hardlockup_all_cpu_backtrace;
>>  	/*
>>  	 * Check for a hardlockup by making sure the CPU's timer
>> @@ -286,7 +298,7 @@ void watchdog_hardlockup_check(unsigned int cpu,
>struct pt_regs *regs)
>>  			clear_bit_unlock(0, &hard_lockup_nmi_warn);
>>  	}
>>  
>> -	sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
>> +	watchdog_sys_info(si_mask);
>>  	if (hardlockup_panic)
>>  		nmi_panic(regs, "Hard LOCKUP");
>>  
>> @@ -798,6 +810,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct
>hrtimer *hrtimer)
>>  	struct pt_regs *regs = get_irq_regs();
>>  	int softlockup_all_cpu_backtrace;
>>  	int duration, thresh_count;
>> +	unsigned long si_mask;
>>  	unsigned long flags;
>>  
>>  	if (!watchdog_enabled)
>> @@ -809,7 +822,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct
>hrtimer *hrtimer)
>>  	if (panic_in_progress())
>>  		return HRTIMER_NORESTART;
>>  
>> -	softlockup_all_cpu_backtrace = (softlockup_si_mask & SYS_INFO_ALL_BT) ?
>> +	si_mask = READ_ONCE(softlockup_si_mask);
>> +	softlockup_all_cpu_backtrace = (si_mask & SYS_INFO_ALL_BT) ?
>>  					1 : sysctl_softlockup_all_cpu_backtrace;
>>  
>>  	watchdog_hardlockup_kick();
>> @@ -900,7 +914,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct
>hrtimer *hrtimer)
>>  		}
>>  
>>  		add_taint(TAINT_SOFTLOCKUP, LOCKDEP_STILL_OK);
>> -		sys_info(softlockup_si_mask & ~SYS_INFO_ALL_BT);
>> +		watchdog_sys_info(si_mask);
>>  		thresh_count = duration / get_softlockup_thresh();
>>  
>>  		if (softlockup_panic && thresh_count >= softlockup_panic)
>> -- 
>> 2.53.0
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt
  2026-06-22  6:30   ` Bradley Morgan
@ 2026-06-22  7:37     ` Feng Tang
  2026-06-22 14:51       ` Bradley Morgan
  0 siblings, 1 reply; 6+ messages in thread
From: Feng Tang @ 2026-06-22  7:37 UTC (permalink / raw)
  To: Bradley Morgan, Andrew Morton, Petr Mladek
  Cc: Douglas Anderson, Mayank Rungta, Tejun Heo, ZhenguoYao,
	Shengming Hu, Joel Granados, Michael Ellerman,
	Madhavan Srinivasan, Nicholas Piggin, Christophe Leroy,
	linux-kernel

On Mon, Jun 22, 2026 at 07:30:18AM +0100, Bradley Morgan wrote:
> On June 22, 2026 4:23:00 AM GMT+01:00, Feng Tang
> <feng.tang@linux.alibaba.com> wrote:
> >Hi,
> >
> >On Sat, Jun 20, 2026 at 10:01:40PM +0000, Bradley Morgan wrote:
> >> The watchdog handles SYS_INFO_ALL_BT itself. When that is the only
> >> watchdog specific bit, sys_info(0) falls back to kernel_sys_info.
> >> 
> >> Skip sys_info() for that case.
> >
> >Thanks for the patch!
> >
> >I would explain some about he intention of the global 'kernel_sys_info'
> >which was suggested by Andrew. One use case is, for kernel stability
> >issues, it could be panic, soft/hard lockup, task-hung etc, and we now
> >have different conrol knobs for them each, but with similar 'xxx_sys_info'
> >capability, and they actually need similar system info like all-cpu
> >dump, blocked processes dump, debug ftrace dump, using one central
> >'kernel_sys_info' could be very handy by avoiding setting many knobs.
> >And for debugging random issues, you can just add sys_info(0)
> >everywhere,  and controll it by the existing 'kernel_si_mask'
> >
> >btw, did you meet some issues with current code? If yes, could you
> >agive some more details ? IIUC, when 'kernel_si_mask' is not set
> >specifically, sys_info(0) is a nop. 
> >
> >Thanks,
> >Feng
> 
> Feng!
> 
> I see what you are saying, but there is a "double ended sword"! :)
> 
> Unfortunately. The issue is where the watchdog specific mask is
> explicitly set to ONLY all_bt for instance.
> 
> The watchdog only handles SYS_INFO_ALL_BT.
> 
> ↓
> 
> so the later call becomes sys_info(0).
> 
> At that point sys_info() cannot tell that the caller had a nonzero
> watchdog mask, and it falls back to kernel_sys_info.
> 
> 
> Here is a example where this would be reached:
> 
> kernel.kernel_sys_info=tasks,mem kernel.hardlockup_sys_info=all_bt
> 
> a hard lockup still dumps tasks and memory through the global default.

Thanks for providing the case. I cannot say this is not a valid case :),
so I'm not against your patch, and would listen to other developers'
opinions.

Thanks,
Feng

> 
> I expected hardlockup_sys_info to override the global default once it
> is explicitly set IMHO.
> 
> IF hardlockup_sys_info is empty..
> 
> This patch keeps the existing fallback! :)
> 
> So the **bug** is not sys_info(0) itself.
> 
> but the watchdog turning an explicit
> all_bt ONLY mask into zero after handling all_bt locally.
> 
> What do you think Feng? Is this good to you? :)
> 
> Cheers!
> 
> >> Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on
> >system lockup")
> >> Signed-off-by: Bradley Morgan <include@grrlz.net>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt
  2026-06-22  7:37     ` Feng Tang
@ 2026-06-22 14:51       ` Bradley Morgan
  0 siblings, 0 replies; 6+ messages in thread
From: Bradley Morgan @ 2026-06-22 14:51 UTC (permalink / raw)
  To: Feng Tang, Andrew Morton, Petr Mladek
  Cc: Douglas Anderson, Mayank Rungta, Tejun Heo, ZhenguoYao,
	Shengming Hu, Joel Granados, Michael Ellerman,
	Madhavan Srinivasan, Nicholas Piggin, Christophe Leroy,
	linux-kernel

On June 22, 2026 8:37:51 AM GMT+01:00, Feng Tang
<feng.tang@linux.alibaba.com> wrote:
>On Mon, Jun 22, 2026 at 07:30:18AM +0100, Bradley Morgan wrote:
>> On June 22, 2026 4:23:00 AM GMT+01:00, Feng Tang
>> <feng.tang@linux.alibaba.com> wrote:
>> >Hi,
>> >
>> >On Sat, Jun 20, 2026 at 10:01:40PM +0000, Bradley Morgan wrote:
>> >> The watchdog handles SYS_INFO_ALL_BT itself. When that is the only
>> >> watchdog specific bit, sys_info(0) falls back to kernel_sys_info.
>> >> 
>> >> Skip sys_info() for that case.
>> >
>> >Thanks for the patch!
>> >
>> >I would explain some about he intention of the global 'kernel_sys_info'
>> >which was suggested by Andrew. One use case is, for kernel stability
>> >issues, it could be panic, soft/hard lockup, task-hung etc, and we now
>> >have different conrol knobs for them each, but with similar
>'xxx_sys_info'
>> >capability, and they actually need similar system info like all-cpu
>> >dump, blocked processes dump, debug ftrace dump, using one central
>> >'kernel_sys_info' could be very handy by avoiding setting many knobs.
>> >And for debugging random issues, you can just add sys_info(0)
>> >everywhere,  and controll it by the existing 'kernel_si_mask'
>> >
>> >btw, did you meet some issues with current code? If yes, could you
>> >agive some more details ? IIUC, when 'kernel_si_mask' is not set
>> >specifically, sys_info(0) is a nop. 
>> >
>> >Thanks,
>> >Feng
>> 
>> Feng!
>> 
>> I see what you are saying, but there is a "double ended sword"! :)
>> 
>> Unfortunately. The issue is where the watchdog specific mask is
>> explicitly set to ONLY all_bt for instance.
>> 
>> The watchdog only handles SYS_INFO_ALL_BT.
>> 
>> ↓
>> 
>> so the later call becomes sys_info(0).
>> 
>> At that point sys_info() cannot tell that the caller had a nonzero
>> watchdog mask, and it falls back to kernel_sys_info.
>> 
>> 
>> Here is a example where this would be reached:
>> 
>> kernel.kernel_sys_info=tasks,mem kernel.hardlockup_sys_info=all_bt
>> 
>> a hard lockup still dumps tasks and memory through the global default.
>
>Thanks for providing the case. I cannot say this is not a valid case :),
>so I'm not against your patch, and would listen to other developers'
>opinions.
>
>Thanks,
>Feng

Thanks Feng!

>> 
>> I expected hardlockup_sys_info to override the global default once it
>> is explicitly set IMHO.
>> 
>> IF hardlockup_sys_info is empty..
>> 
>> This patch keeps the existing fallback! :)
>> 
>> So the **bug** is not sys_info(0) itself.
>> 
>> but the watchdog turning an explicit
>> all_bt ONLY mask into zero after handling all_bt locally.
>> 
>> What do you think Feng? Is this good to you? :)
>> 
>> Cheers!
>> 
>> >> Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info
>on
>> >system lockup")
>> >> Signed-off-by: Bradley Morgan <include@grrlz.net>
>

Thanks!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt
  2026-06-20 22:01 [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt Bradley Morgan
  2026-06-22  3:23 ` Feng Tang
@ 2026-06-23 12:37 ` Petr Mladek
  1 sibling, 0 replies; 6+ messages in thread
From: Petr Mladek @ 2026-06-23 12:37 UTC (permalink / raw)
  To: Bradley Morgan
  Cc: Andrew Morton, Douglas Anderson, Mayank Rungta, Tejun Heo,
	Feng Tang, ZhenguoYao, Shengming Hu, Joel Granados, linux-kernel

On Sat 2026-06-20 22:01:40, Bradley Morgan wrote:
> The watchdog handles SYS_INFO_ALL_BT itself. When that is the only
> watchdog specific bit, sys_info(0) falls back to kernel_sys_info.

Great catch!

> Skip sys_info() for that case.
> 
> Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on system lockup")
> Signed-off-by: Bradley Morgan <include@grrlz.net>

> --- a/kernel/watchdog.c
> +++ b/kernel/watchdog.c
> @@ -54,6 +54,16 @@ static int __read_mostly watchdog_hardlockup_available;
>  struct cpumask watchdog_cpumask __read_mostly;
>  unsigned long *watchdog_cpumask_bits = cpumask_bits(&watchdog_cpumask);
>  

Similar problem exists also in kernel/panic.c. It would make
sense to put this variant into lib/sys_info.c and use a generic name,
e.g. sys_info_without_all_bt().

> +static void watchdog_sys_info(unsigned long si_mask)
> +{
> +	unsigned long dump_mask = si_mask & ~SYS_INFO_ALL_BT;
> +

This looks like an optimization. The real reason is not obvious.
It would deserve a comment, something like:

	/*
	 * Do not call sys_info() when the caller context required
	 * only backtraces from all CPUs. Otherwise, sys_info()
	 * would fall back to the generic "kernel_si_mask".
	 */
> +	if (si_mask && !dump_mask)
> +		return;
> +
> +	sys_info(dump_mask);
> +}

Alternative solution would be to remove the custom
trigger_all*_cpu_backtrace() calls from both watchdog and panic
code and rely on sys_info() API. But it is not easy, especially
in panic().

Otherwise, the changes make sense.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-06-23 12:37 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-20 22:01 [PATCH 1/1] watchdog: avoid extra sys_info dumps for all_bt Bradley Morgan
2026-06-22  3:23 ` Feng Tang
2026-06-22  6:30   ` Bradley Morgan
2026-06-22  7:37     ` Feng Tang
2026-06-22 14:51       ` Bradley Morgan
2026-06-23 12:37 ` Petr Mladek

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.