On Fri, Aug 20, 2021 at 7:59 PM Dave Marchevsky davemarchevsky@fb.com wrote:
bpf_vprintk functions similarly to BPF_SEQ_PRINTF and BPF_SNPRINTF macros elsewhere in the file - it allows use of bpf_trace_vprintk without manual conversion of varargs to u64 array.
Like the bpf_printk macro, bpf_vprintk is meant to be the main interface to the bpf_trace_vprintk helper and thus is uncapitalized.
Signed-off-by: Dave Marchevsky davemarchevsky@fb.com
tools/lib/bpf/bpf_helpers.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/tools/lib/bpf/bpf_helpers.h b/tools/lib/bpf/bpf_helpers.h index b9987c3efa3c..43c8115956c3 100644 --- a/tools/lib/bpf/bpf_helpers.h +++ b/tools/lib/bpf/bpf_helpers.h @@ -224,4 +224,22 @@ enum libbpf_tristate { ___param, sizeof(___param)); \ })
+/*
- bpf_vprintk wraps the bpf_trace_printk helper with variadic arguments
- instead of an array of u64.
- */
+#define bpf_vprintk(fmt, args...) \
Given BPF_SNPRINTF and BPF_SEQ_PRINTF, should we call this one in all-caps as well?
+({ \
static const char ___fmt[] = fmt; \
unsigned long long ___param[___bpf_narg(args)]; \
I wonder how hard would it be to still use bpf_trace_printk() if the number of input arguments is less than 3? That way you could use BPF_PRINTF() everywhere, even on old kernels (you just need to remember to use < 3 arguments). WDYT? It might be more challenging than it seems, given it's hard to do conditionals inside #defines :(
\
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \
___bpf_fill(___param, args); \
_Pragma("GCC diagnostic pop") \
\
bpf_trace_vprintk(___fmt, sizeof(___fmt), \
___param, sizeof(___param)); \
+})
#endif
2.30.2