Re: [PATCH 09/11] x86: rework CONFIG_GENERIC_CPU compiler flags

From: Tor Vic
Date: Wed Dec 04 2024 - 10:42:27 EST




On 12/4/24 11:30, Arnd Bergmann wrote:
From: Arnd Bergmann <arnd@xxxxxxxx>

Building an x86-64 kernel with CONFIG_GENERIC_CPU is documented to
run on all CPUs, but the Makefile does not actually pass an -march=
argument, instead relying on the default that was used to configure
the toolchain.

In many cases, gcc will be configured to -march=x86-64 or -march=k8
for maximum compatibility, but in other cases a distribution default
may be either raised to a more recent ISA, or set to -march=native
to build for the CPU used for compilation. This still works in the
case of building a custom kernel for the local machine.

The point where it breaks down is building a kernel for another
machine that is older the the default target. Changing the default
to -march=x86-64 would make it work reliable, but possibly produce
worse code on distros that intentionally default to a newer ISA.

To allow reliably building a kernel for either the oldest x86-64
CPUs or a more recent level, add three separate options for
v1, v2 and v3 of the architecture as defined by gcc and clang
and make them all turn on CONFIG_GENERIC_CPU. Based on this it
should be possible to change runtime feature detection into
build-time detection for things like cmpxchg16b, or possibly
gate features that are only available on older architectures.


Hi Arnd,

Similar but not identical changes have been proposed in the past several times like e.g. in 1, 2 and likely even more often.

Your solution seems to be much cleaner, I like it.

That said, on my Skylake platform, there is no difference between -march=x86-64 and -march=x86-64-v3 in terms of kernel binary size or performance.
I think Boris also said that these settings make no real difference on code generation.

Other settings might make a small difference (numbers are from 2023):
-generic: 85.089.784 bytes
-core2: 85.139.932 bytes
-march=skylake: 85.017.808 bytes

----
[1] https://lore.kernel.org/all/4_u6ZNYPbaK36xkLt8ApRhiRTyWp_-NExHCH_tTFO_fanDglEmcbfowmiB505heI4md2AuR9hS-VSkf4s90sXb5--AnNTOwvPaTmcgzRYSY=@proton.me/

[2] https://lore.kernel.org/all/20230707105601.133221-1-dimitri.ledkov@xxxxxxxxxxxxx/