On Thu, Jul 25, 2019 at 3:52 PM Stanislav Fomichev <sdf@xxxxxxxxxx> wrote: > > C flow dissector supports input flags that tell it to customize parsing > by either stopping early or trying to parse as deep as possible. > BPF flow dissector always parses as deep as possible which is sub-optimal. > Pass input flags to the BPF flow dissector as well so it can make the same > decisions. > > Series outline: > * remove unused FLOW_DISSECTOR_F_STOP_AT_L3 flag > * export FLOW_DISSECTOR_F_XXX flags as uapi and pass them to BPF > flow dissector > * add documentation for the export flags > * support input flags in BPF_PROG_TEST_RUN via ctx_{in,out} > * sync uapi to tools > * support FLOW_DISSECTOR_F_PARSE_1ST_FRAG in selftest > * support FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL in kernel and selftest > * support FLOW_DISSECTOR_F_STOP_AT_ENCAP in selftest > > Pros: > * makes BPF flow dissector faster by avoiding burning extra cycles > * existing BPF progs continue to work by ignoring the flags and always > parsing as deep as possible > > Cons: > * new UAPI which we need to support (OTOH, if we need to deprecate some > flags, we can just stop setting them upon calling BPF programs) > > Some numbers (with .repeat = 4000000 in test_flow_dissector): > test_flow_dissector:PASS:ipv4-frag 35 nsec > test_flow_dissector:PASS:ipv4-frag 35 nsec > test_flow_dissector:PASS:ipv4-no-frag 32 nsec > test_flow_dissector:PASS:ipv4-no-frag 32 nsec > > test_flow_dissector:PASS:ipv6-frag 39 nsec > test_flow_dissector:PASS:ipv6-frag 39 nsec > test_flow_dissector:PASS:ipv6-no-frag 36 nsec > test_flow_dissector:PASS:ipv6-no-frag 36 nsec > > test_flow_dissector:PASS:ipv6-flow-label 36 nsec > test_flow_dissector:PASS:ipv6-flow-label 36 nsec > test_flow_dissector:PASS:ipv6-no-flow-label 33 nsec > test_flow_dissector:PASS:ipv6-no-flow-label 33 nsec > > test_flow_dissector:PASS:ipip-encap 38 nsec > test_flow_dissector:PASS:ipip-encap 38 nsec > test_flow_dissector:PASS:ipip-no-encap 32 nsec > test_flow_dissector:PASS:ipip-no-encap 32 nsec > > The improvement is around 10%, but it's in a tight cache-hot > BPF_PROG_TEST_RUN loop. Applied. Thanks