* Re: [GIT PULL] string fixes for v6.15-rc1
[not found] ` <CAHk-=wijG2dSOOFr8CCYygwxZQxdTUj73rfB8=tyZP-3G-8-og@mail.gmail.com>
@ 2025-04-07 17:37 ` Nathan Chancellor
2025-04-07 19:02 ` Linus Torvalds
0 siblings, 1 reply; 5+ messages in thread
From: Nathan Chancellor @ 2025-04-07 17:37 UTC (permalink / raw)
To: Linus Torvalds
Cc: Kees Cook, linux-kernel, Andrey Konovalov, Andy Shevchenko,
Catalin Marinas, Peter Collingbourne, Vincenzo Frascino,
Will Deacon, llvm
Hi Linus,
On Sun, Apr 06, 2025 at 07:04:29PM -0700, Linus Torvalds wrote:
> On Sun, 6 Apr 2025 at 18:33, Kees Cook <kees@kernel.org> wrote:
> >
> > I should have said "libcall optimizations". It's not just blindly constructing calls.
>
> But it's *WRONG*.
>
> It's stupid. It's not an optimization, it makes things worse.
>
> > This is the same kind of thing that has been heavily discussed before for bcmp() and stpcpy()
>
> And it makes a bit more sense at least for stpcpy(), because the
> implementation there is basically "strlen+memcpy". Both of which we
> want the compiler to work on - even if we're not interested in it ever
> using stpcpy().
>
> IOF, for stpcpy, there's at least a *reason* for the compiler to do it.
>
> For something like wcslen() the answer is "DON'T DO THIS". Because
> there is absolutely zero upside to trying to recognize this pattern,
> and there is real downside.
>
> See?
>
> Don't work around the compiler doing stupid things. Fix the compiler
> options to tell the compiler to "Don'tDoThatThen(tm)".
So I do not necessarily disagree with you in the general sense for these
types of optimizations but I figured that in this case, where this
optimization only gets applied twice in a single translation unit
throughout the entire kernel from what I can tell, the overhead was
unlikely to matter much and it felt less problematic to just add the
function. If this is still genuinely unacceptable in your eyes in spite
of that, so be it.
I will admit I did not actually test if '-fno-builtin-wcslen' would not
work with LTO when I wrote the commit message (I merely drew on the
experience for bcmp() several years ago). Now that I have, it appears
to, at least for the simple arm64 allmodconfig case that I tested.
Looking into it, it looks like '-fno-builtin-*' started being honored
properly for LTO with [1] in LLVM 10 and fixed/adjusted for inlining in
[2] in LLVM 11.
So would the following change be acceptable? I can draft up a commit
message and send it along today if so.
diff --git a/Makefile b/Makefile
index 38689a0c3605..a137de124897 100644
--- a/Makefile
+++ b/Makefile
@@ -1057,6 +1057,10 @@ KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3)
KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow)
KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow)
+# Ensure clang does not transform certain loops into calls to wcslen() after
+# https://github.com/llvm/llvm-project/commit/9694844d7e36fd5e01011ab56b64f27b867aa72d
+KBUILD_CFLAGS-$(call clang-min-version, 210000) += -fno-builtin-wcslen
+
# disable invalid "can't wrap" optimizations for signed / pointers
KBUILD_CFLAGS += -fno-strict-overflow
---
[1]: https://github.com/llvm/llvm-project/commit/878ab6df033d44430939c02075ee00800995dc3b
[2]: https://github.com/llvm/llvm-project/commit/f9ca75f19bab639988ebbe68c81d07babd952afb
Cheers,
Nathan
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [GIT PULL] string fixes for v6.15-rc1
2025-04-07 17:37 ` [GIT PULL] string fixes for v6.15-rc1 Nathan Chancellor
@ 2025-04-07 19:02 ` Linus Torvalds
2025-04-07 19:25 ` Nathan Chancellor
0 siblings, 1 reply; 5+ messages in thread
From: Linus Torvalds @ 2025-04-07 19:02 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Kees Cook, linux-kernel, Andrey Konovalov, Andy Shevchenko,
Catalin Marinas, Peter Collingbourne, Vincenzo Frascino,
Will Deacon, llvm
On Mon, 7 Apr 2025 at 10:37, Nathan Chancellor <nathan@kernel.org> wrote:
>
> So would the following change be acceptable? I can draft up a commit
> message and send it along today if so.
Absoluterly. That's the right thing to do.
> +# Ensure clang does not transform certain loops into calls to wcslen() after
> +# https://github.com/llvm/llvm-project/commit/9694844d7e36fd5e01011ab56b64f27b867aa72d
> +KBUILD_CFLAGS-$(call clang-min-version, 210000) += -fno-builtin-wcslen
I think you could just use
KBUILD_CFLAGS += $(call cc-option, -fno-builtin-wcslen)
instead, and not use some version check?
Linus
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [GIT PULL] string fixes for v6.15-rc1
2025-04-07 19:02 ` Linus Torvalds
@ 2025-04-07 19:25 ` Nathan Chancellor
2025-04-07 20:25 ` Linus Torvalds
0 siblings, 1 reply; 5+ messages in thread
From: Nathan Chancellor @ 2025-04-07 19:25 UTC (permalink / raw)
To: Linus Torvalds
Cc: Kees Cook, linux-kernel, Andrey Konovalov, Andy Shevchenko,
Catalin Marinas, Peter Collingbourne, Vincenzo Frascino,
Will Deacon, llvm
On Mon, Apr 07, 2025 at 12:02:04PM -0700, Linus Torvalds wrote:
> On Mon, 7 Apr 2025 at 10:37, Nathan Chancellor <nathan@kernel.org> wrote:
> > +# Ensure clang does not transform certain loops into calls to wcslen() after
> > +# https://github.com/llvm/llvm-project/commit/9694844d7e36fd5e01011ab56b64f27b867aa72d
> > +KBUILD_CFLAGS-$(call clang-min-version, 210000) += -fno-builtin-wcslen
>
> I think you could just use
>
> KBUILD_CFLAGS += $(call cc-option, -fno-builtin-wcslen)
>
> instead, and not use some version check?
Sure, I just figured this has not been a problem up until this point so
applying it for older versions of clang should not be necessary (since
the optimization that introduces it does not exist) but also not be
harmful. However, I would rather not call out to the compiler since we
know it is supported with all versions of clang (and GCC but it
obviously does not need it) so maybe just
KBUILD_CFLAGS-$(CONFIG_CC_IS_CLANG) += -fno-builtin-wcslen
or
ifdef CONFIG_CC_IS_CLANG
KBUILD_CFLAGS += -fno-builtin-wcslen
endif
or if you do want this for GCC too, unconditionally adding it should be
fine too.
KBUILD_CFLAGS += -fno-builtin-wcslen
No strong opinion, let me know your preference and I will make it so.
Cheers,
Nathan
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [GIT PULL] string fixes for v6.15-rc1
2025-04-07 19:25 ` Nathan Chancellor
@ 2025-04-07 20:25 ` Linus Torvalds
2025-04-07 21:01 ` Nathan Chancellor
0 siblings, 1 reply; 5+ messages in thread
From: Linus Torvalds @ 2025-04-07 20:25 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Kees Cook, linux-kernel, Andrey Konovalov, Andy Shevchenko,
Catalin Marinas, Peter Collingbourne, Vincenzo Frascino,
Will Deacon, llvm
On Mon, 7 Apr 2025 at 12:25, Nathan Chancellor <nathan@kernel.org> wrote:
>
> or if you do want this for GCC too, unconditionally adding it should be
> fine too.
I think if unconditionally works, that's probably the best option
simply because it's the simplest option.
But I don't see 'wcslen' in the gcc docs, which was why I was assuming
it wanted that "check if it works" thing with "$(call cc-option,...)"
I don't think we need to call out the particular compiler, since the
argument against using it is not compiler-specific per se.
Linus
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [GIT PULL] string fixes for v6.15-rc1
2025-04-07 20:25 ` Linus Torvalds
@ 2025-04-07 21:01 ` Nathan Chancellor
0 siblings, 0 replies; 5+ messages in thread
From: Nathan Chancellor @ 2025-04-07 21:01 UTC (permalink / raw)
To: Linus Torvalds
Cc: Kees Cook, linux-kernel, Andrey Konovalov, Andy Shevchenko,
Catalin Marinas, Peter Collingbourne, Vincenzo Frascino,
Will Deacon, llvm
On Mon, Apr 07, 2025 at 01:25:04PM -0700, Linus Torvalds wrote:
> I think if unconditionally works, that's probably the best option
> simply because it's the simplest option.
>
> But I don't see 'wcslen' in the gcc docs, which was why I was assuming
> it wanted that "check if it works" thing with "$(call cc-option,...)"
It appears that neither gcc nor clang warn for "invalid" libcall values
to '-fno-builtin-*':
$ echo 'int main(void) { return 0; }' | clang -fno-builtin-ireallydonotexist -o /dev/null -S -x c -
$ echo 'int main(void) { return 0; }' | gcc -fno-builtin-ireallydonotexist -o /dev/null -S -x c -
> I don't think we need to call out the particular compiler, since the
> argument against using it is not compiler-specific per se.
Sounds good, I will ultimately make this:
# Ensure compilers do not transform certain loops into calls to wcslen()
KBUILD_CFLAGS += -fno-builtin-wcslen
Cheers,
Nathan
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-04-07 21:02 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <202504061053.F27227CA@keescook>
[not found] ` <CAHk-=whVfxi4KRu-H=tsgSdoGdDz1bvu0_miJT0BTgAf4igpdg@mail.gmail.com>
[not found] ` <FFE5FB0B-CC92-4A25-8014-E7548AD1C469@kernel.org>
[not found] ` <CAHk-=wijG2dSOOFr8CCYygwxZQxdTUj73rfB8=tyZP-3G-8-og@mail.gmail.com>
2025-04-07 17:37 ` [GIT PULL] string fixes for v6.15-rc1 Nathan Chancellor
2025-04-07 19:02 ` Linus Torvalds
2025-04-07 19:25 ` Nathan Chancellor
2025-04-07 20:25 ` Linus Torvalds
2025-04-07 21:01 ` Nathan Chancellor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox