On Wed, Oct 09, 2019 at 10:03:43AM +0200, Toke Høiland-Jørgensen wrote: > Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> writes: > > > Please implement proper indirect calls and jumps. > > I am still not convinced this will actually solve our problem; but OK, I > can give it a shot. If you're not convinced let's talk about it first. Indirect calls is a building block for debugpoints. Let's not call them tracepoints, because Linus banned any discusion that includes that name. The debugpoints is a way for BPF program to insert points in its code to let external facility to do tracing and debugging. void (*debugpoint1)(struct xdp_buff *, int code); void (*debugpoint2)(struct xdp_buff *); void (*debugpoint3)(int len); int bpf_prog(struct xdp_buff *ctx) { // let's parse the packet if (debugpoint3) debugpoint3(ctx->data_end - ctx->data); if (condition) { // deciding to drop this packet if (debugpoint1) debugpoint1(ctx, XDP_DROP); return XDP_DROP; } if (some other condition) { // lets pass it to the stack if (debugpoint2) debugpoint2(ctx); return XDP_PASS; } } In normal operation nothing is being called. The execution cost to the program is load plus branch. But since program is annotated with BTF the external tool, like bpftool, can load another program and populate debugpointN pointer in the original program to trace its execution. Essentially it's live debugging (tracing) of cooperative bpf programs that added debugpoints to their code. Obviously indirect calls can be used for a ton of other things including proper chaing of progs, but I'm convinced that you don't need chaining to solve your problem. You need debugging. If you disagree please explain _your_ problem again. Saying that fb katran is a use case for chaining is, hrm, not correct.