Re: [PATCH 2/3] bpf powerpc: implement support for tail calls
From: Naveen N. Rao <hidden>
Date: 2016-09-26 09:09:41
Also in:
lkml, netdev
On 2016/09/26 11:00AM, Daniel Borkmann wrote:
On 09/26/2016 10:56 AM, Naveen N. Rao wrote:quoted
On 2016/09/24 03:30AM, Alexei Starovoitov wrote:quoted
On Sat, Sep 24, 2016 at 12:33:54AM +0200, Daniel Borkmann wrote:quoted
On 09/23/2016 10:35 PM, Naveen N. Rao wrote:quoted
Tail calls allow JIT'ed eBPF programs to call into other JIT'ed eBPF programs. This can be achieved either by: (1) retaining the stack setup by the first eBPF program and having all subsequent eBPF programs re-using it, or, (2) by unwinding/tearing down the stack and having each eBPF program deal with its own stack as it sees fit. To ensure that this does not create loops, there is a limit to how many tail calls can be done (currently 32). This requires the JIT'ed code to maintain a count of the number of tail calls done so far. Approach (1) is simple, but requires every eBPF program to have (almost) the same prologue/epilogue, regardless of whether they need it. This is inefficient for small eBPF programs which may not sometimes need a prologue at all. As such, to minimize impact of tail call implementation, we use approach (2) here which needs each eBPF program in the chain to use its own prologue/epilogue. This is not ideal when many tail calls are involved and when all the eBPF programs in the chain have similar prologue/epilogue. However, the impact is restricted to programs that do tail calls. Individual eBPF programs are not affected. We maintain the tail call count in a fixed location on the stack and updated tail call count values are passed in through this. The very first eBPF program in a chain sets this up to 0 (the first 2 instructions). Subsequent tail calls skip the first two eBPF JIT instructions to maintain the count. For programs that don't do tail calls themselves, the first two instructions are NOPs. Signed-off-by: Naveen N. Rao <redacted>Thanks for adding support, Naveen, that's really great! I think 2) seems fine as well in this context as prologue size can vary quite a bit here, and depending on program types likelihood of tail call usage as well (but I wouldn't expect deep nesting). Thanks a lot!Great stuff. In this circumstances approach 2 makes sense to me as well.Alexie, Daniel, Thanks for the quick review!The patches would go via Michael's tree (same way as with the JIT itself in the past), right?
Yes, this set is contained within arch/powerpc, so Michael can take this through his tree. The other set with updates to samples/bpf can probably go through David's tree. - Naveen