On Thu, Mar 24, 2016 at 11:49 PM, Eric Dumazet <eric.duma...@gmail.com> wrote: > On Thu, 2016-03-24 at 23:40 +0100, Yann Ylavic wrote: > >> FWIW, I find: >> >> const struct bpf_insn prog[] = { >> /* BPF_MOV64_REG(BPF_REG_6, BPF_REG_1) */ >> { BPF_ALU64 | BPF_MOV | BPF_X, BPF_REG_6, BPF_REG_1, 0, 0 }, >> /* BPF_LD_ABS(BPF_W, 0) R0 = (uint32_t)skb[0] */ >> { BPF_LD | BPF_ABS | BPF_W, 0, 0, 0, 0 }, >> /* BPF_ALU64_IMM(BPF_MOD, BPF_REG_0, mod) */ >> { BPF_ALU64 | BPF_MOD | BPF_K, BPF_REG_0, 0, 0, mod }, >> /* BPF_EXIT_INSN() */ >> { BPF_JMP | BPF_EXIT, 0, 0, 0, 0 } >> }; >> (and all the way to make it run) >> >> something quite unintuitive from a web server developper perspective, >> simply to make SO_REUSEPORT work with forked TCP listeners (probably >> as it should out of the box)... > > > That is why EBPF has LLVM backend. > > Basically you can write your "BPF" program in C, and let llvm convert it > into EBPF.
I'll learn how to do this to get the best performances from the server, but having to do so to work around what looks like a defect (for simple/default SMP configurations at least, no NUMA or clever CPU-affinity or queuing policy involved) seems odd in the first place. >From this POV, draining the (ending) listeners is already non obvious but might be reasonable, (e)BPF sounds really overkill. But there are surely plenty of good reasons for it, and I won't be able to dispute your technical arguments in any case ;) > > Sure, you still can write BPF manually, as you could write HTTPS server > in assembly. OK, I'll take your previous proposal :)