bpf: introduce bpf_skb_vlan_push/pop() helpers
Allow eBPF programs attached to TC qdiscs call skb_vlan_push/pop via helper functions. These functions may change skb->data/hlen which are cached by some JITs to improve performance of ld_abs/ld_ind instructions. Therefore JITs need to recognize bpf_skb_vlan_push/pop() calls, re-compute header len and re-cache skb->data/hlen back into cpu registers. Note, skb->data/hlen are not directly accessible from the programs, so any changes to skb->data done either by these helpers or by other TC actions are safe. eBPF JIT supported by three architectures: - arm64 JIT is using bpf_load_pointer() without caching, so it's ok as-is. - x64 JIT re-caches skb->data/hlen unconditionally after vlan_push/pop calls (experiments showed that conditional re-caching is slower). - s390 JIT falls back to interpreter for now when bpf_skb_vlan_push() is present in the program (re-caching is tbd). These helpers allow more scalable handling of vlan from the programs. Instead of creating thousands of vlan netdevs on top of eth0 and attaching TC+ingress+bpf to all of them, the program can be attached to eth0 directly and manipulate vlans as necessary. Signed-off-by:Alexei Starovoitov <ast@plumgrid.com> Signed-off-by:
David S. Miller <davem@davemloft.net>
Showing
- arch/s390/net/bpf_jit_comp.c 4 additions, 0 deletionsarch/s390/net/bpf_jit_comp.c
- arch/x86/net/bpf_jit_comp.c 42 additions, 38 deletionsarch/x86/net/bpf_jit_comp.c
- include/linux/bpf.h 2 additions, 0 deletionsinclude/linux/bpf.h
- include/linux/filter.h 1 addition, 0 deletionsinclude/linux/filter.h
- include/uapi/linux/bpf.h 2 additions, 0 deletionsinclude/uapi/linux/bpf.h
- net/core/filter.c 48 additions, 0 deletionsnet/core/filter.c
Loading
Please register or sign in to comment