]> git.baikalelectronics.ru Git - kernel.git/commit
bpf: Don't rely on GCC __attribute__((optimize)) to disable GCSE
authorArd Biesheuvel <ardb@kernel.org>
Wed, 28 Oct 2020 17:15:05 +0000 (18:15 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 30 Oct 2020 03:01:46 +0000 (20:01 -0700)
commitbddc1353ce531a21461aa3be8bd16c2cf56c08f4
tree4492c9e254a8b97c966a4ecdc0a149d4fe39aba5
parentaca9a95c3bbf6e9fb0f6ec0dbf3b462f3eec54c9
bpf: Don't rely on GCC __attribute__((optimize)) to disable GCSE

Commit 38522fdbc ("bpf: Disable GCC -fgcse optimization for
___bpf_prog_run()") introduced a __no_fgcse macro that expands to a
function scope __attribute__((optimize("-fno-gcse"))), to disable a
GCC specific optimization that was causing trouble on x86 builds, and
was not expected to have any positive effect in the first place.

However, as the GCC manual documents, __attribute__((optimize))
is not for production use, and results in all other optimization
options to be forgotten for the function in question. This can
cause all kinds of trouble, but in one particular reported case,
it causes -fno-asynchronous-unwind-tables to be disregarded,
resulting in .eh_frame info to be emitted for the function.

This reverts commit 38522fdbc, and instead, it disables the -fgcse
optimization for the entire source file, but only when building for
X86 using GCC with CONFIG_BPF_JIT_ALWAYS_ON disabled. Note that the
original commit states that CONFIG_RETPOLINE=n triggers the issue,
whereas CONFIG_RETPOLINE=y performs better without the optimization,
so it is kept disabled in both cases.

Fixes: 38522fdbc99d ("bpf: Disable GCC -fgcse optimization for ___bpf_prog_run()")
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Link: https://lore.kernel.org/lkml/CAMuHMdUg0WJHEcq6to0-eODpXPOywLot6UD2=GFHpzoj_hCoBQ@mail.gmail.com/
Link: https://lore.kernel.org/bpf/20201028171506.15682-2-ardb@kernel.org
include/linux/compiler-gcc.h
include/linux/compiler_types.h
kernel/bpf/Makefile
kernel/bpf/core.c