selftests/bpf: Using llvm may_goto inline asm for cond_break macro
authorYonghong Song <yonghong.song@linux.dev>
Tue, 2 Apr 2024 02:54:46 +0000 (19:54 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 2 Apr 2024 14:14:00 +0000 (16:14 +0200)
Currently, cond_break macro uses bytes to encode the may_goto insn.
Patch [1] in llvm implemented may_goto insn in BPF backend.
Replace byte-level encoding with llvm inline asm for better usability.
Using llvm may_goto insn is controlled by macro __BPF_FEATURE_MAY_GOTO.

  [1] https://github.com/llvm/llvm-project/commit/0e0bfacff71859d1f9212205f8f873d47029d3fb

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20240402025446.3215182-1-yonghong.song@linux.dev
tools/testing/selftests/bpf/bpf_experimental.h

index a5b9df38c162595c8c63420d3eb425149eddeef7..3329ea0808659c16cc0182453fd1bd36d7ad7fe1 100644 (file)
@@ -326,6 +326,16 @@ l_true:                                                                                            \
        })
 #endif
 
+#ifdef __BPF_FEATURE_MAY_GOTO
+#define cond_break                                     \
+       ({ __label__ l_break, l_continue;               \
+        asm volatile goto("may_goto %l[l_break]"       \
+                     :::: l_break);                    \
+       goto l_continue;                                \
+       l_break: break;                                 \
+       l_continue:;                                    \
+       })
+#else
 #define cond_break                                     \
        ({ __label__ l_break, l_continue;               \
         asm volatile goto("1:.byte 0xe5;                       \
@@ -337,6 +347,7 @@ l_true:                                                                                             \
        l_break: break;                                 \
        l_continue:;                                    \
        })
+#endif
 
 #ifndef bpf_nop_mov
 #define bpf_nop_mov(var) \