[Bloat] high speed packet and protocol processing in userspace?

Daniel Borkmann daniel at iogearbox.net
Fri Mar 17 08:10:32 EDT 2017


On 03/17/2017 10:02 AM, Jesper Dangaard Brouer wrote:
> On Thu, 16 Mar 2017 09:27:44 -0700 Eric Dumazet <eric.dumazet at gmail.com> wrote:
>> On Thu, 2017-03-16 at 11:52 -0400, Michael Richardson wrote:
>>> Dave Taht <dave.taht at gmail.com> wrote:
>>>      > Is it faster to execute 17 bpf vm instructions on (nearly) every
>>>      > packet, or to use all that old stuff?
>>>
>>> My understanding is that there is a JIT for ebpf.
>>
>> ebpf is pretty fast.
>
> To Dave what kind of arch are you running on?
> AFAIK you were running on MIPS right?
> Just checked the kernel tree and I was surprised to see a bpf JIT for mips:
>
> $ ls -1 arch/mips/net/bpf_jit*
> arch/mips/net/bpf_jit_asm.S
> arch/mips/net/bpf_jit.c
> arch/mips/net/bpf_jit.h
>
> But I don't know what state it is in (Markos?)

The JIT is for cBPF right now, but Cavium guys mentioned on netdev
recently that they're going to implement an eBPF JIT for mips 64.

You can see current cBPF and eBPF JITs that are supported by the
kernel via:

$ git grep BPF_JIT | grep select
arch/arm/Kconfig:	select HAVE_CBPF_JIT
arch/arm64/Kconfig:	select HAVE_EBPF_JIT
arch/mips/Kconfig:	select HAVE_CBPF_JIT if !CPU_MICROMIPS
arch/powerpc/Kconfig:	select HAVE_CBPF_JIT if !PPC64
arch/powerpc/Kconfig:	select HAVE_EBPF_JIT if PPC64
arch/s390/Kconfig:	select HAVE_EBPF_JIT if PACK_STACK && HAVE_MARCH_Z196_FEATURES
arch/sparc/Kconfig:	select HAVE_CBPF_JIT
arch/x86/Kconfig:	select HAVE_EBPF_JIT			if X86_64

[...]
> The main point for getting performance out of eBPF is to avoid writing
> a generic framework that need to handle everything.  The point is only
> to emit the instructions you need for your specific use-case.
>
> You should think about eBPF as a programmable policy (that we don't
> need/want to add to the kernel code and maintain forever) See this talk:
>   https://github.com/iovisor/bpf-docs/blob/master/XDP_Inside_and_Out.pdf
>
>> Note that you can use C to write your parser, then use LLVM to
>> generate native eBPF code.
>
> Yes, that is how I use eBPF, writing restricted-C that LLVM compiles
> into eBPF code.  You can look at examples in the kernel git tree under
> samples/bpf/

Another, perhaps more complex project for eBPF in combination with
tc + sched_clsact + cls_bpf in da (direct-action) mode can be found
under: https://github.com/cilium/cilium (see bpf/ folder for the C
code that LLVM compiles down to eBPF if you're curious).

Cheers,
Daniel



More information about the Bloat mailing list