Re: [PATCH v2 1/4] sys_info: add helper for callers that handle all_bt
From: Bradley Morgan
Date: Thu Jun 25 2026 - 10:46:09 EST
On June 25, 2026 3:03:48 PM GMT+01:00, Petr Mladek <pmladek@xxxxxxxx>
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 <include@xxxxxxxxx>
>> ---
>> 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 <include@xxxxxxxxx>
>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 <include@xxxxxxxxx>
>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!