selftests/bpf: Mark uprobe trigger functions with nocf_check attribute
authorJiri Olsa <jolsa@kernel.org>
Fri, 22 Mar 2024 13:49:36 +0000 (14:49 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 22 Mar 2024 17:01:17 +0000 (10:01 -0700)
Some distros seem to enable the -fcf-protection=branch by default,
which breaks our setup on first instruction of uprobe trigger
functions and place there endbr64 instruction.

Marking them with nocf_check attribute to skip that.

Ignoring unknown attribute warning in gcc for bench objects, because
nocf_check can be used only when -fcf-protection=branch is enabled,
otherwise we get a warning and break compilation.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20240322134936.1075395-1-jolsa@kernel.org
tools/include/linux/compiler.h
tools/testing/selftests/bpf/benchs/bench_trigger.c

index 7b65566f3e427254615da2cabf09962caa93369b..8a63a9913495a672d4d2ed10b42134ae7f12584b 100644 (file)
 #define noinline
 #endif
 
+#ifndef __nocf_check
+#define __nocf_check __attribute__((nocf_check))
+#endif
+
 /* Are two types/vars the same type (ignoring qualifiers)? */
 #ifndef __same_type
 # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
index 9c50412f72e97f91c3f4fd5fdf3b3b35c53436fb..d66eddacd64266ef4f3e04b46bcc2fb07ce89aab 100644 (file)
@@ -9,6 +9,8 @@
 /* adjust slot shift in inc_hits() if changing */
 #define MAX_BUCKETS 256
 
+#pragma GCC diagnostic ignored "-Wattributes"
+
 /* BPF triggering benchmarks */
 static struct trigger_ctx {
        struct trigger_bench *skel;
@@ -167,7 +169,7 @@ static void trigger_fmodret_setup(void)
  * GCC doesn't generate stack setup preample for these functions due to them
  * having no input arguments and doing nothing in the body.
  */
-__weak void uprobe_target_nop(void)
+__nocf_check __weak void uprobe_target_nop(void)
 {
        asm volatile ("nop");
 }
@@ -176,7 +178,7 @@ __weak void opaque_noop_func(void)
 {
 }
 
-__weak int uprobe_target_push(void)
+__nocf_check __weak int uprobe_target_push(void)
 {
        /* overhead of function call is negligible compared to uprobe
         * triggering, so this shouldn't affect benchmark results much
@@ -185,7 +187,7 @@ __weak int uprobe_target_push(void)
        return 1;
 }
 
-__weak void uprobe_target_ret(void)
+__nocf_check __weak void uprobe_target_ret(void)
 {
        asm volatile ("");
 }