• Andrey Ignatov's avatar
    bpf: Avoid retpoline for bpf_for_each_map_elem · 0640c77c
    Andrey Ignatov authored
    Similarly to 09772d92 ("bpf: avoid retpoline for
    lookup/update/delete calls on maps") and 84430d42 ("bpf, verifier:
    avoid retpoline for map push/pop/peek operation") avoid indirect call
    while calling bpf_for_each_map_elem.
    
    Before (a program fragment):
    
      ; if (rules_map) {
       142: (15) if r4 == 0x0 goto pc+8
       143: (bf) r3 = r10
      ; bpf_for_each_map_elem(rules_map, process_each_rule, &ctx, 0);
       144: (07) r3 += -24
       145: (bf) r1 = r4
       146: (18) r2 = subprog[+5]
       148: (b7) r4 = 0
       149: (85) call bpf_for_each_map_elem#143680  <-- indirect call via
                                                        helper
    
    After (same program fragment):
    
       ; if (rules_map) {
        142: (15) if r4 == 0x0 goto pc+8
        143: (bf) r3 = r10
       ; bpf_for_each_map_elem(rules_map, process_each_rule, &ctx, 0);
        144: (07) r3 += -24
        145: (bf) r1 = r4
        146: (18) r2 = subprog[+5]
        148: (b7) r4 = 0
        149: (85) call bpf_for_each_array_elem#170336  <-- direct call
    
    On a benchmark that calls bpf_for_each_map_elem() once and does many
    other things (mostly checking fields in skb) with CONFIG_RETPOLINE=y it
    makes program faster.
    
    Before:
    
      ============================================================================
      Benchmark.cpp                                              time/iter iters/s
      ============================================================================
      IngressMatchByRemoteEndpoint                                80.78ns 12.38M
      IngressMatchByRemoteIP                                      80.66ns 12.40M
      IngressMatchByRemotePort                                    80.87ns 12.37M
    
    After:
    
      ============================================================================
      Benchmark.cpp                                              time/iter iters/s
      ============================================================================
      IngressMatchByRemoteEndpoint                                73.49ns 13.61M
      IngressMatchByRemoteIP                                      71.48ns 13.99M
      IngressMatchByRemotePort                                    70.39ns 14.21M
    Signed-off-by: default avatarAndrey Ignatov <rdna@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20211006001838.75607-1-rdna@fb.com
    0640c77c
verifier.c 401 KB