Thread (22 messages) 22 messages, 4 authors, 2018-03-26

Re: [PATCH v2 bpf-next 5/8] bpf: introduce BPF_RAW_TRACEPOINT

From: Daniel Borkmann <daniel@iogearbox.net>
Date: 2018-03-26 07:54:05
Also in: linux-api

On 03/24/2018 02:43 AM, Alexei Starovoitov wrote:
On 3/23/18 5:58 PM, Alexei Starovoitov wrote:
quoted
On 3/23/18 4:13 PM, Daniel Borkmann wrote:
quoted
On 03/22/2018 04:41 PM, Alexei Starovoitov wrote:
quoted
On 3/22/18 2:43 AM, Daniel Borkmann wrote:
quoted
On 03/21/2018 07:54 PM, Alexei Starovoitov wrote:
[...]
quoted
quoted
quoted
I picked 6 as a good compromise and used it twice in bpf_trace_run1x()
Similar thing possible for u64 arg1, u64 arg2, ...
but it will be harder to read.
Looking forward what you can come up with.
Just took a quick look, so the below one would work for generating the
signature and function. I did till 9 here:

#define UNPACK(...)            __VA_ARGS__
#define REPEAT_1(FN, DL, X, ...)    FN(X)
#define REPEAT_2(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_1(FN, DL,
__VA_ARGS__)
#define REPEAT_3(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_2(FN, DL,
__VA_ARGS__)
#define REPEAT_4(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_3(FN, DL,
__VA_ARGS__)
#define REPEAT_5(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_4(FN, DL,
__VA_ARGS__)
#define REPEAT_6(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_5(FN, DL,
__VA_ARGS__)
#define REPEAT_7(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_6(FN, DL,
__VA_ARGS__)
#define REPEAT_8(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_7(FN, DL,
__VA_ARGS__)
#define REPEAT_9(FN, DL, X, ...)    FN(X) UNPACK DL REPEAT_8(FN, DL,
__VA_ARGS__)
#define REPEAT(X, FN, DL, ...)        REPEAT_##X(FN, DL, __VA_ARGS__)

#define SARG(X)        u64 arg##X
#define COPY(X)        args[X] = arg##X

#define __DL_COM    (,)
#define __DL_SEM    (;)

#define __SEQ        0, 1, 2, 3, 4, 5, 6, 7, 8, 9

#define BPF_TRACE_DECL_x(x)                        \
    void bpf_trace_run##x(struct bpf_prog *prog,            \
                  REPEAT(x, SARG, __DL_COM, __SEQ))
#define BPF_TRACE_DEFN_x(x)                        \
    void bpf_trace_run##x(struct bpf_prog *prog,            \
                  REPEAT(x, SARG, __DL_COM, __SEQ))        \
    {                                \
        u64 args[x];                        \
        REPEAT(x, COPY, __DL_SEM, __SEQ);            \
        __bpf_trace_run(prog, args);                \
    }                                \
    EXPORT_SYMBOL_GPL(bpf_trace_run##x)

So doing a ...

BPF_TRACE_DECL_x(5);
BPF_TRACE_DEFN_x(5);
interestingly that in addition to above defining
#define __REPEAT(X, FN, DL, ...) REPEAT_##X(FN, DL, __VA_ARGS__)
to allow recursive expansion and doing
__REPEAT(12, BPF_TRACE_DECL_x, __DL_SEM, __SEQ_1_12);
almost works...
I'm guessing it's hitting preprocessor internal limit on
number of expressions to expand.
It expands 1-6 nicely and 7-12 are partially expanded :)
it's not the limit I'm hitting, but self referential issue.
Exactly half gets expanded.
I don't think there is an easy workaround other
than duplicating the whole chain of REPEAT macro twice
with slightly different name.
Hmm, that is kind of annoying, probably worth filing a bug on gcc, we still
won't be able to use it near term though.

Given it expands just fine from 1-6 arguments, I think Steven had a good
choice on upper limit of 6 args then (including build error with above). ;-)

Thanks,
Daniel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help