public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Linus Torvalds <torvalds@linuxfoundation.org>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org, kees@kernel.org,
	acarmina@redhat.com, jpoimboe@kernel.org, mark.rutland@arm.com
Subject: Re: [RFC 6/8] x86_64/bug: Implement __WARN_printf()
Date: Mon, 2 Jun 2025 17:49:43 +0200	[thread overview]
Message-ID: <20250602154943.GB30486@noisy.programming.kicks-ass.net> (raw)
In-Reply-To: <CAHk-=whkD=pveK6X_5gtVbJ62+86oBOr9JokneYpSJyxjHFBpQ@mail.gmail.com>

On Mon, Jun 02, 2025 at 08:02:24AM -0700, Linus Torvalds wrote:
> On Mon, 2 Jun 2025 at 07:52, Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > Use the normal COUNT_ARGS() trick to split the variadic WARN() macro
> > into per nr_args sub-marcos, except use a custom mapping such that 4
> > and above map to another variadic that does the current thing as
> > fallback.
> 
> Does this horror work with clang? Because I suspect not. The games you
> play with inline asm are too disgusting for words.

Yes, it absolutely builds with clang. The inline asm isn't something we
don't already do elsewhere :-) *cough* extable *cough*

> But honestly, even if it does,I really hate this kind of insane
> complexity for dubious reasons.
> 
> If you have a warning that is *so* critical for performance that you
> can't deal with the register movement that comes from the compiler
> doing this for you, just remove the warning.
> 
> Don't make our build system do something this disgusting.

It isn't just the register movement. What we currently have for WARN()
is:

WARN(cond, fmt, arg...)

	if (unlikely(cond)) {
		__warn_printf(fmt, arg);
		ud2
	}

Where the UD2 bug_entry will have NO_CUT_HERE, because __warn_printf()
will have started the printing.

Part of the problem is with unlikely() not causing the text to break out
into .text.unlikely, but at best it moves it to the end of whatever
function we're in.

This also means that if you do WARN_ONCE() the whole ONCE machinery is
also dumped into that function.

And now someone wants to go add some KUnit specific testing to this as
well, which is also dumped into the function.

This is all cruft that shouldn't be in the normal .text.


The horrors I did will change things into:

	if (unlikely(cond))
		ud1 regs

where the bug_entry will then have the fmt, and the ud1 instruction some
regs (provided 3 or less args). Then all the ONCE and KUnit crap can
live in the exception handler. Not littered around the real code.


Now, I can still relate to: "this is too horrible for words". But then I
would strongly suggest people go poke at the compilers so we can get:

	if (really_unlikely(cond)) {
		whatever;
	}

such that the compiler is forced to split whatever into a cold
sub-function placed in .text.unlikely. Then it doesn't really matter how
much crap we stick in there, it will not affect the normal code paths /
I$.

Anyway, I had fun hacking this up :-)

  reply	other threads:[~2025-06-02 15:50 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-02 14:42 [RFC 0/8] x86: Mad WARN() hackery Peter Zijlstra
2025-06-02 14:42 ` [RFC 1/8] x86: Provide assembly __bug_table helpers Peter Zijlstra
2025-06-02 14:42 ` [RFC 2/8] bug: Add BUGFLAG_FORMAT infrastructure Peter Zijlstra
2025-06-02 14:42 ` [RFC 3/8] bug: Clean up CONFIG_GENERIC_BUG_RELATIVE_POINTERS Peter Zijlstra
2025-06-02 14:42 ` [RFC 4/8] bug: Allow architectures to provide __WARN_printf() Peter Zijlstra
2025-06-02 14:42 ` [RFC 5/8] x86_64/bug: Add BUG_FORMAT basics Peter Zijlstra
2025-06-02 14:42 ` [RFC 6/8] x86_64/bug: Implement __WARN_printf() Peter Zijlstra
2025-06-02 15:02   ` Linus Torvalds
2025-06-02 15:49     ` Peter Zijlstra [this message]
2025-06-02 16:38       ` Linus Torvalds
2025-06-02 18:09         ` Peter Zijlstra
2025-06-02 20:04           ` Josh Poimboeuf
2025-06-02 20:16           ` Josh Poimboeuf
2025-06-02 20:33             ` Andrew Cooper
2025-06-02 21:57         ` Peter Zijlstra
2025-06-02 22:01           ` Peter Zijlstra
2025-06-02 23:10           ` Linus Torvalds
2025-06-03 13:04             ` Peter Zijlstra
2025-06-03 22:23               ` David Laight
2025-06-02 14:42 ` [RFC 7/8] x86/bug: Implement WARN_ONCE() Peter Zijlstra
2025-06-02 14:42 ` [RFC 8/8] x86: Clean up default rethunk warning Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250602154943.GB30486@noisy.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=acarmina@redhat.com \
    --cc=jpoimboe@kernel.org \
    --cc=kees@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=torvalds@linuxfoundation.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox