lkml.org 
[lkml]   [2021]   [Apr]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH bpf-next v3 4/6] libbpf: Initialize the bpf_seq_printf parameters array field by field
    Date
    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>
    ---
    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.31.1.295.g9ea45b61b8-goog
    \
     
     \ /
      Last update: 2021-04-12 17:38    [W:3.673 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site