[PATCH 00/15] Implement CONFIG_DEBUG_BUGVERBOSE_DETAILED=y, to improve WARN_ON_ONCE() output by adding the condition string

Ingo Molnar posted 15 patches 7 months, 1 week ago
arch/arm64/include/asm/bug.h     |  2 +-
arch/loongarch/include/asm/bug.h | 25 ++++++++++++-------------
arch/parisc/include/asm/bug.h    |  6 +++---
arch/powerpc/include/asm/bug.h   | 12 ++++++------
arch/riscv/include/asm/bug.h     | 10 +++++-----
arch/s390/include/asm/bug.h      | 10 +++++-----
arch/sh/include/asm/bug.h        |  4 ++--
arch/x86/include/asm/bug.h       | 14 +++++++-------
include/asm-generic/bug.h        | 13 ++++++++++---
kernel/panic.c                   | 16 +++++++++-------
lib/Kconfig.debug                | 10 ++++++++++
11 files changed, 70 insertions(+), 52 deletions(-)
[PATCH 00/15] Implement CONFIG_DEBUG_BUGVERBOSE_DETAILED=y, to improve WARN_ON_ONCE() output by adding the condition string
Posted by Ingo Molnar 7 months, 1 week ago
Changes in -v2:

 - Incorporated review feedback:

    - Make the expanded strings conditional on the new
      CONFIG_DEBUG_BUGVERBOSE_DETAILED=y switch, to address concerns
      about the +100K kernel size increase, disabled by default.

    - Expanded the Cc: fields

 - Rebased to v6.15-rc6

This tree can also be found at:

	git://git.kernel.org/pub/scm/linux/kernel/git/mingo/tip.git WIP.core/bugs

Thanks,

	Ingo

=========================>
Original -v1 announcement:

This series improves the current WARN_ON_ONCE() output, if
the new CONFIG_DEBUG_BUGVERBOSE_DETAILED=y option is enabled,
from:

  WARN_ON_ONCE(idx < 0 && ptr);
  ...

  WARNING: CPU: 0 PID: 0 at kernel/sched/core.c:8511 sched_init+0x20/0x410

to (on all __WARN_FLAGS() using architectures except S390):

  WARNING: [idx < 0 && ptr] kernel/sched/core.c:8511 at sched_init+0x20/0x410 CPU#0: swapper/0

(Note the addition of the '[condition string]', and a reorganized CPU/comm/PID trailer.)

... and on S390 and non-__WARN_FLAGS architectures to:

  WARNING: kernel/sched/core.c:8511 at sched_init+0x20/0x410 CPU#0: swapper/0

and on non-x86 architectures (the CPU/PID fields in the WARNING line are skipped):

  WARNING: kernel/sched/core.c:8511 sched_init+0x20/0x410
  CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 6.14.0-01616-g94d7af2844aa #4 PREEMPT(undef)

The motivation behind this series is the SCHED_WARN_ON() primitive that
got removed in the v6.14 merge window:

  f7d2728cc032 ("sched/debug: Change SCHED_WARN_ON() to WARN_ON_ONCE()")

... which produced more informative debug output, as it included the
WARN_ON_ONCE() condition string - at the expense of worse code generation.

This series, based on Linus's latest Git tree, merges the code generation
benefits of modern WARN_ON_ONCE() bug_entry architecture code with the expanded
information content of SCHED_WARN_ON().

The cost is about +100K more .data on a defconfig kernel, and no runtime
code generation impact:

       text       data        bss         dec        hex    filename
   29523998    7926322    1389904    38840224    250a7a0    vmlinux.x86.defconfig.before
   29523998    8024626    1389904    38938528    25227a0    vmlinue.x86.defconfig.after

On !CONFIG_DEBUG_BUGVERBOSE_DETAILED there's no size difference.

The series was build and boot tested on x86, with an expectation for it to
work on other architectures (with no testing at the moment to back up that
expectation).


    Ingo

================>
Ingo Molnar (15):
  bugs/core: Extend __WARN_FLAGS() with the 'cond_str' parameter
  bugs/core: Pass down the condition string of WARN_ON_ONCE(cond) warnings to __WARN_FLAGS()
  bugs/core: Introduce the CONFIG_DEBUG_BUGVERBOSE_DETAILED Kconfig switch
  bugs/x86: Extend _BUG_FLAGS() with the 'cond_str' parameter
  bugs/x86: Augment warnings output by concatenating 'cond_str' with the regular __FILE__ string in _BUG_FLAGS()
  bugs/powerpc: Pass in 'cond_str' to BUG_ENTRY()
  bugs/powerpc: Concatenate 'cond_str' with '__FILE__' in BUG_ENTRY(), to extend WARN_ON/BUG_ON output
  bugs/LoongArch: Pass in 'cond_str' to __BUG_ENTRY()
  bugs/LoongArch: Concatenate 'cond_str' with '__FILE__' in __BUG_ENTRY(), to extend WARN_ON/BUG_ON output
  bugs/s390: Pass in 'cond_str' to __EMIT_BUG()
  bugs/riscv: Pass in 'cond_str' to __BUG_FLAGS()
  bugs/riscv: Concatenate 'cond_str' with '__FILE__' in __BUG_FLAGS(), to extend WARN_ON/BUG_ON output
  bugs/parisc: Concatenate 'cond_str' with '__FILE__' in __WARN_FLAGS(), to extend WARN_ON/BUG_ON output
  bugs/sh: Concatenate 'cond_str' with '__FILE__' in __WARN_FLAGS(), to extend WARN_ON/BUG_ON output
  bugs/core: Reorganize fields in the first line of WARNING output, add ->comm[] output

 arch/arm64/include/asm/bug.h     |  2 +-
 arch/loongarch/include/asm/bug.h | 25 ++++++++++++-------------
 arch/parisc/include/asm/bug.h    |  6 +++---
 arch/powerpc/include/asm/bug.h   | 12 ++++++------
 arch/riscv/include/asm/bug.h     | 10 +++++-----
 arch/s390/include/asm/bug.h      | 10 +++++-----
 arch/sh/include/asm/bug.h        |  4 ++--
 arch/x86/include/asm/bug.h       | 14 +++++++-------
 include/asm-generic/bug.h        | 13 ++++++++++---
 kernel/panic.c                   | 16 +++++++++-------
 lib/Kconfig.debug                | 10 ++++++++++
 11 files changed, 70 insertions(+), 52 deletions(-)

-- 
2.45.2
Re: [PATCH 00/15] Implement CONFIG_DEBUG_BUGVERBOSE_DETAILED=y, to improve WARN_ON_ONCE() output by adding the condition string
Posted by David Laight 7 months ago
On Thu, 15 May 2025 14:46:29 +0200
Ingo Molnar <mingo@kernel.org> wrote:

> Changes in -v2:
> 
>  - Incorporated review feedback:
> 
>     - Make the expanded strings conditional on the new
>       CONFIG_DEBUG_BUGVERBOSE_DETAILED=y switch, to address concerns
>       about the +100K kernel size increase, disabled by default.
> 
>     - Expanded the Cc: fields
> 
>  - Rebased to v6.15-rc6
> 
> This tree can also be found at:
> 
> 	git://git.kernel.org/pub/scm/linux/kernel/git/mingo/tip.git WIP.core/bugs
> 
> Thanks,
> 
> 	Ingo
> 
> =========================>  
> Original -v1 announcement:
> 
> This series improves the current WARN_ON_ONCE() output, if
> the new CONFIG_DEBUG_BUGVERBOSE_DETAILED=y option is enabled,
> from:
> 
>   WARN_ON_ONCE(idx < 0 && ptr);
>   ...
> 
>   WARNING: CPU: 0 PID: 0 at kernel/sched/core.c:8511 sched_init+0x20/0x410

What happens if the condition contains #defines?
Does it output what is in the source file, or the (bloated) expanded text?
For instance:
	WARN_ON_ONCE(min(foo, bar) < baz);
doesn't really want to show the expansion of min().

	David
Re: [PATCH 00/15] Implement CONFIG_DEBUG_BUGVERBOSE_DETAILED=y, to improve WARN_ON_ONCE() output by adding the condition string
Posted by Ingo Molnar 6 months, 1 week ago
* David Laight <david.laight.linux@gmail.com> wrote:

> On Thu, 15 May 2025 14:46:29 +0200
> Ingo Molnar <mingo@kernel.org> wrote:
> 
> > Changes in -v2:
> > 
> >  - Incorporated review feedback:
> > 
> >     - Make the expanded strings conditional on the new
> >       CONFIG_DEBUG_BUGVERBOSE_DETAILED=y switch, to address concerns
> >       about the +100K kernel size increase, disabled by default.
> > 
> >     - Expanded the Cc: fields
> > 
> >  - Rebased to v6.15-rc6
> > 
> > This tree can also be found at:
> > 
> > 	git://git.kernel.org/pub/scm/linux/kernel/git/mingo/tip.git WIP.core/bugs
> > 
> > Thanks,
> > 
> > 	Ingo
> > 
> > =========================>  
> > Original -v1 announcement:
> > 
> > This series improves the current WARN_ON_ONCE() output, if
> > the new CONFIG_DEBUG_BUGVERBOSE_DETAILED=y option is enabled,
> > from:
> > 
> >   WARN_ON_ONCE(idx < 0 && ptr);
> >   ...
> > 
> >   WARNING: CPU: 0 PID: 0 at kernel/sched/core.c:8511 sched_init+0x20/0x410
> 
> What happens if the condition contains #defines?
> Does it output what is in the source file, or the (bloated) expanded text?
> For instance:
> 	WARN_ON_ONCE(min(foo, bar) < baz);
> doesn't really want to show the expansion of min().

I'm using the '#' 'stringizing' CPP token to stringify the expression, 
which doesn't expand macros but turns macro arguments into string 
literals:

	WARNING: [ptr == 0 && (min(0,1) < 1)] kernel/sched/core.c:8509 at sched_init+0x20/0x410, CPU#0: swapper/0

Thanks,

	Ingo
Re: [PATCH 00/15] Implement CONFIG_DEBUG_BUGVERBOSE_DETAILED=y, to improve WARN_ON_ONCE() output by adding the condition string
Posted by Peter Zijlstra 6 months, 1 week ago

Ingo, have you seen my recent WARN hackery? I'm thinking we can do tihs
on top of those much simpler.