Re: [PATCH bpf-next] selftests/bpf: make multi-uprobe tests work in RELEASE=1 mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Mar 29, 2024 at 10:37 AM Andrii Nakryiko <andrii@xxxxxxxxxx> wrote:
>
> When BPF selftests are built in RELEASE=1 mode with -O2 optimization
> level, uprobe_multi binary, called from multi-uprobe tests is optimized
> to the point that all the thousands of target uprobe_multi_func_XXX
> functions are eliminated, breaking tests.
>
> So ensure they are preserved through noinline + asm volatile trick.
>
> But, actually, compiling uprobe_multi binary with -O2 takes a really
> long time, and is quite useless (it's not a benchmark). So in addition
> to ensuring that uprobe_multi_func_XXX functions are preserved, opt-out
> of -O2 explicitly in Makefile and stick to -O0. This saves a lot of
> compilation time.
>
> Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx>
> ---
>  tools/testing/selftests/bpf/Makefile       | 2 +-
>  tools/testing/selftests/bpf/uprobe_multi.c | 4 +++-
>  2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
> index 3b9eb40d6343..b0ac3dd80acf 100644
> --- a/tools/testing/selftests/bpf/Makefile
> +++ b/tools/testing/selftests/bpf/Makefile
> @@ -759,7 +759,7 @@ $(OUTPUT)/veristat: $(OUTPUT)/veristat.o
>
>  $(OUTPUT)/uprobe_multi: uprobe_multi.c
>         $(call msg,BINARY,,$@)
> -       $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
> +       $(Q)$(CC) $(CFLAGS) -O0 $(LDFLAGS) $^ $(LDLIBS) -o $@
>
>  EXTRA_CLEAN := $(SCRATCH_DIR) $(HOST_SCRATCH_DIR)                      \
>         prog_tests/tests.h map_tests/tests.h verifier/tests.h           \
> diff --git a/tools/testing/selftests/bpf/uprobe_multi.c b/tools/testing/selftests/bpf/uprobe_multi.c
> index a61ceab60b68..e38228563766 100644
> --- a/tools/testing/selftests/bpf/uprobe_multi.c
> +++ b/tools/testing/selftests/bpf/uprobe_multi.c
> @@ -9,7 +9,9 @@
>
>  #define NAME(name, idx) PASTE(name, idx)
>
> -#define DEF(name, idx)  int NAME(name, idx)(void) { return 0; }
> +#define DEF(name, idx) \
> +       int __attribute__((noinline)) \
> +       NAME(name, idx)(void) { asm volatile (""); return 0; }

I prefer to use __weak to avoid inlining and compiler optimizations.
It's less work for compiler as well,
since noinline doesn't tell compiler to stop analyzing the body
of the function, while __weak does have such an effect.
And asm won't be necessary as well.





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux