| From 2a5195e9dbdfacf94f770f61bf6430c1cff680f0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 19 Apr 2021 17:52:41 +0200 |
| Subject: libbpf: Initialize the bpf_seq_printf parameters array field by field |
| |
| From: Florent Revest <revest@chromium.org> |
| |
| [ Upstream commit 83cd92b46484aa8f64cdc0bff8ac6940d1f78519 ] |
| |
| When initializing the __param array with a one liner, if all args are |
| const, the initial array value will be placed in the rodata section but |
| because libbpf does not support relocation in the rodata section, any |
| pointer in this array will stay NULL. |
| |
| Fixes: c09add2fbc5a ("tools/libbpf: Add bpf_iter support") |
| Signed-off-by: Florent Revest <revest@chromium.org> |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Acked-by: Andrii Nakryiko <andrii@kernel.org> |
| Link: https://lore.kernel.org/bpf/20210419155243.1632274-5-revest@chromium.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/lib/bpf/bpf_tracing.h | 40 +++++++++++++++++++++++++++---------- |
| 1 file changed, 29 insertions(+), 11 deletions(-) |
| |
| diff --git a/tools/lib/bpf/bpf_tracing.h b/tools/lib/bpf/bpf_tracing.h |
| index f9ef37707888..1c2e91ee041d 100644 |
| --- a/tools/lib/bpf/bpf_tracing.h |
| +++ b/tools/lib/bpf/bpf_tracing.h |
| @@ -413,20 +413,38 @@ typeof(name(0)) name(struct pt_regs *ctx) \ |
| } \ |
| static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args) |
| |
| +#define ___bpf_fill0(arr, p, x) do {} while (0) |
| +#define ___bpf_fill1(arr, p, x) arr[p] = x |
| +#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args) |
| +#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args) |
| +#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args) |
| +#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args) |
| +#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args) |
| +#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args) |
| +#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args) |
| +#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args) |
| +#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args) |
| +#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args) |
| +#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args) |
| +#define ___bpf_fill(arr, args...) \ |
| + ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args) |
| + |
| /* |
| * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values |
| * in a structure. |
| */ |
| -#define BPF_SEQ_PRINTF(seq, fmt, args...) \ |
| - ({ \ |
| - _Pragma("GCC diagnostic push") \ |
| - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ |
| - static const char ___fmt[] = fmt; \ |
| - unsigned long long ___param[] = { args }; \ |
| - _Pragma("GCC diagnostic pop") \ |
| - int ___ret = bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ |
| - ___param, sizeof(___param)); \ |
| - ___ret; \ |
| - }) |
| +#define BPF_SEQ_PRINTF(seq, fmt, args...) \ |
| +({ \ |
| + static const char ___fmt[] = fmt; \ |
| + unsigned long long ___param[___bpf_narg(args)]; \ |
| + \ |
| + _Pragma("GCC diagnostic push") \ |
| + _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ |
| + ___bpf_fill(___param, args); \ |
| + _Pragma("GCC diagnostic pop") \ |
| + \ |
| + bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ |
| + ___param, sizeof(___param)); \ |
| +}) |
| |
| #endif |
| -- |
| 2.30.2 |
| |