Re: [PATCH net-next 1/2] bpf: enable non-root eBPF programs
From: Daniel Borkmann <hidden>
Date: 2015-10-06 18:04:08
Also in:
lkml, netdev
On 10/06/2015 07:50 PM, Alexei Starovoitov wrote:
On 10/6/15 1:39 AM, Daniel Borkmann wrote:quoted
quoted
quoted
[...] Also classic BPF would then need to test for it, since a socket filter doesn't really know whether native eBPF is loaded there or a classic-to-eBPF transformed one, and classic never makes use of this. Anyway, it could be done by adding a bit flag cb_access:1 to the bpf_prog, set it during eBPF verification phase, and test it inside sk_filter() if I see it correctly.That could also be done in an unlikely() branch, to keep the cost to the non-eBPF case near zero.Yes, agreed. For the time being, the majority of users are coming from the classic BPF side anyway and the unlikely() could still be changed later on if it should not be the case anymore. The flag and bpf_func would share the same cacheline as well.was also thinking that we can do it only in paths that actually have multiple protocol layers, since today bpf is mainly used with tcpdump(raw_socket) and new af_packet fanout both have cb cleared on RX, because it just came out of alloc_skb and no layers were called, and on TX we can clear 20 bytes in dev_queue_xmit_nit(). af_unix/netlink also have clean skb. Need to analyze tun and sctp... but it feels overly fragile to save a branch in sk_filter, so planning to go with if(unlikely(prog->cb_access)) memset in sk_filter().
I was also thinking that for dev_queue_xmit_nit(), since we do the skb_clone() there, to have a clone version (w/o affecting performance of the current one) that instead of copying cb[] over, it would just do a memset(). But that would just be limited to AF_PACKET, and doesn't catch all sk_filter() users. Thanks, Daniel