RE: [PATCH bpf-next v3 0/5] xdp: Support multiple programs on a single interface through chain calls
From: Toke Høiland-Jørgensen <hidden>
Date: 2019-10-08 08:42:06
Also in:
bpf
John Fastabend [off-list ref] writes:
Toke Høiland-Jørgensen wrote:quoted
This series adds support for executing multiple XDP programs on a single interface in sequence, through the use of chain calls, as discussed at the Linux Plumbers Conference last month: https://linuxplumbersconf.org/event/4/contributions/460/Can we add RFC to the title if we are just iterating through idea-space here.
I don't view this as "just iterating through idea-space". I'll admit that I may have overestimated the extent to which we were all on the same page on this after LPC, but I do view these submissions as serious proposals that are making progress... :)
quoted
# HIGH-LEVEL IDEA Since Alexei pointed out some issues with trying to rewrite the eBPF byte code, let's try a third approach: We add the ability to chain call programs into the eBPF execution core itself, but without rewriting the eBPF byte code. As in the previous version, the bpf() syscall gets a couple of new commands which takes a pair of BPF program fds and a return code. It will then attach the second program to the first one in a structured keyed by return code. When a program chain is thus established, the former program will tail call to the latter at the end of its execution. The actual tail calling is achieved by adding a new flag to struct bpf_prog and having BPF_PROG_RUN run the chain call logic if that flag is set. This means that if the feature is *not* used, the overhead is a single conditional branch (which means I couldn't measure a performance difference, as can be seen in the results below).I still believe user space should be able to link these multiple programs together as Ed and I were suggesting in the last series.
I expect that userspace probably could (I mean, after all, eBPF is within spitting distance of a full almost-Turing-complete executing environment so userspace can conceivably do pretty much anything). However, I don't believe that doing it in userspace is the best solution. I view it as a tradeoff: How much complexity do we have to add to the kernel to make things easier for userspace. And given that we can do this without negatively impacting performance, and with a reasonable cost in terms of complexity (both of which I think this series demonstrates that yes, we can), I think this makes sense to put in the kernel.
Also by doing it by linking your control program can be arbitrary complex. For example not just taking the output of one program and jumping to another but doing arbitrary more complex/interesting things. Taking the input from multiple programs to pick next call for example.
I expect there will indeed be more complex use cases where combining multiple programs in arbitrary complex ways would make a lot of sense, and doing that by linking in userspace is probably a good fit for that. But for the simple use case of running multiple programs after one another, I think it is overkill, and something that is better to do in the kernel. -Toke