On June 25, 2026 3:03:48 PM GMT+01:00, Petr Mladek <[email protected]>
wrote:
>On Tue 2026-06-23 15:34:58, Bradley Morgan wrote:
>> Some callers handle SYS_INFO_ALL_BT themselves before calling
>sys_info().
>> Add a helper that strips that bit without turning an all_bt only mask
>into
>> a kernel_sys_info fallback.
>> 
>> Signed-off-by: Bradley Morgan <[email protected]>
>> ---
>> Changes since v1:
>> - New patch for the shared helper suggested by Petr.
>> 
>>  include/linux/sys_info.h |  1 +
>>  lib/sys_info.c           | 15 +++++++++++++++
>>  2 files changed, 16 insertions(+)
>> 
>> diff --git a/include/linux/sys_info.h b/include/linux/sys_info.h
>> index a5bc3ea3d44b..87a841ec7b6a 100644
>> --- a/include/linux/sys_info.h
>> +++ b/include/linux/sys_info.h
>> @@ -18,6 +18,7 @@
>>  #define SYS_INFO_BLOCKED_TASKS              0x00000080
>>  
>>  void sys_info(unsigned long si_mask);
>> +void sys_info_without_all_bt(unsigned long si_mask);
>>  unsigned long sys_info_parse_param(char *str);
>>  
>>  #ifdef CONFIG_SYSCTL
>> diff --git a/lib/sys_info.c b/lib/sys_info.c
>> index f32a06ec9ed4..6afd4c697633 100644
>> --- a/lib/sys_info.c
>> +++ b/lib/sys_info.c
>> @@ -164,3 +164,18 @@ void sys_info(unsigned long si_mask)
>>  {
>>      __sys_info(si_mask ? : kernel_si_mask);
>>  }
>> +
>> +void sys_info_without_all_bt(unsigned long si_mask)
>> +{
>> +    unsigned long dump_mask = si_mask & ~SYS_INFO_ALL_BT;
>> +
>> +    /*
>> +     * 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);
>> +}
>
>Sashiko AI pointed out that this function still migth trigger printing
>duplicate backtraces when (si_mask == 0). It calls sys_info(0)
>which falls back to kernel_si_mask which might have SYS_INFO_ALL_BT
>bit set, see
>https://sashiko.dev/#/patchset/9b8c96e291696815d3c7de5d3e199298dee0279d.1782228656.git.include%40grrlz.net
>
>=> we need to eventually disable the SYS_INFO_ALL_BT bit also
>   in kernel_si_mask.
>
>I think about creating a generic API which would allow to apply
>a filter mask, something like:
>
>From 02fc810a801adc0fc4d1fd14318415719bdfc656 Mon Sep 17 00:00:00 2001
>From: Bradley Morgan <[email protected]>
>Date: Tue, 23 Jun 2026 15:34:58 +0000
>Subject: [PATCH 1/4] sys_info: add helper for callers that print some
>sys_info on their own
>
>Some callers print some sys_info on their own before calling sys_info().
>Add a helper which would allow to prevent a duplicated output.
>
>It is a bit tricky because kernel_si_mask should be used only
>when the call-specific si_mask is empty. But the duplicated
>output must be prevented there as well.
>
>Signed-off-by: Bradley Morgan <[email protected]>
>Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on 
>system lockup") ?
>Fixes: a9af76a78760 ("watchdog: add sys_info sysctls to dump sys info on 
>system lockup")
>---
> include/linux/sys_info.h |  1 +
> lib/sys_info.c           | 20 ++++++++++++++++++--
> 2 files changed, 19 insertions(+), 2 deletions(-)
>
>diff --git a/include/linux/sys_info.h b/include/linux/sys_info.h
>index a5bc3ea3d44b..f1c2552ca3d1 100644
>--- a/include/linux/sys_info.h
>+++ b/include/linux/sys_info.h
>@@ -18,6 +18,7 @@
> #define SYS_INFO_BLOCKED_TASKS                0x00000080
> 
> void sys_info(unsigned long si_mask);
>+void sys_info_with_filter(unsigned long si_mask, unsigned long 
>si_ignore_mask);
> unsigned long sys_info_parse_param(char *str);
> 
> #ifdef CONFIG_SYSCTL
>diff --git a/lib/sys_info.c b/lib/sys_info.c
>index f32a06ec9ed4..d411fee10415 100644
>--- a/lib/sys_info.c
>+++ b/lib/sys_info.c
>@@ -136,8 +136,10 @@ static int __init sys_info_sysctl_init(void)
> subsys_initcall(sys_info_sysctl_init);
> #endif
> 
>-static void __sys_info(unsigned long si_mask)
>+static void __sys_info(unsigned long si_mask, unsigned long si_ignore_mask)
> {
>+      si_mask &= ~si_ignore_mask;
>+
>       if (si_mask & SYS_INFO_TASKS)
>               show_state();
> 
>@@ -160,7 +162,21 @@ static void __sys_info(unsigned long si_mask)
>               show_state_filter(TASK_UNINTERRUPTIBLE);
> }
> 
>+void sys_info_with_filter(unsigned long si_mask, unsigned long si_ignore_mask)
>+{
>+      unsigned long dump_mask = si_mask & ~si_ignore_mask;
>+
>+      /*
>+       * Do not fall back to kernel_si_mask when the caller context
>+       * required only the ignored information.
>+       */
>+      if (si_mask && !dump_mask)
>+              return;
>+
>+      __sys_info(dump_mask ? : kernel_si_mask, si_ignore_mask);
>+}
>+
> void sys_info(unsigned long si_mask)
> {
>-      __sys_info(si_mask ? : kernel_si_mask);
>+      sys_info_with_filter(si_mask, 0);
> }
>
>The next patches might use sys_info_with_filter(si_mask,
>SYS_INFO_ALL_BT) instead of sys_info_without_all_bt(si_mask).
>
>Feel free to bike shed about the function name. Also I am not
>sure whether to pass the filter as bits to filter or already
>the complement (~mask).
>
>Best Regards,
>Petr
>
>

Okay petr, so, The whole V3 situation..

I have to 
- Add (or modify) your suggestion
- Add fengs reviewed by tag
- and find a more neutral fixes tag
- And also add Cc stable to patch 1

Ill work on V4 today.

Thanks!

Reply via email to