• Jiong Wang's avatar
    nfp: bpf: support backward jump · 854dc87d
    Jiong Wang authored
    This patch adds support for backward jump on NFP.
    
      - restrictions on backward jump in various functions have been removed.
      - nfp_fixup_branches now supports backward jump.
    
    There is one thing to note, currently an input eBPF JMP insn may generate
    several NFP insns, for example,
    
      NFP imm move insn A \
      NFP compare insn  B  --> 3 NFP insn jited from eBPF JMP insn M
      NFP branch insn   C /
      ---
      NFP insn X           --> 1 NFP insn jited from eBPF insn N
      ---
      ...
    
    therefore, we are doing sanity check to make sure the last jited insn from
    an eBPF JMP is a NFP branch instruction.
    
    Once backward jump is allowed, it is possible an eBPF JMP insn is at the
    end of the program. This is however causing trouble for the sanity check.
    Because the sanity check requires the end index of the NFP insns jited from
    one eBPF insn while only the start index is recorded before this patch that
    we can only get the end index by:
    
      start_index_of_the_next_eBPF_insn - 1
    
    or for the above example:
    
      start_index_of_eBPF_insn_N (which is the index of NFP insn X) - 1
    
    nfp_fixup_branches was using nfp_for_each_insn_walk2 to expose *next* insn
    to each iteration during the traversal so the last index could be
    calculated from which. Now, it needs some extra code to handle the last
    insn. Meanwhile, the use of walk2 is actually unnecessary, we could simply
    use generic single instruction walk to do this, the next insn could be
    easily calculated using list_next_entry.
    
    So, this patch migrates the jump fixup traversal method to
    *list_for_each_entry*, this simplifies the code logic a little bit.
    
    The other thing to note is a new state variable "last_bpf_off" is
    introduced to track the index of the last jited NFP insn. This is necessary
    because NFP is generating special purposes epilogue sequences, so the index
    of the last jited NFP insn is *not* always nfp_prog->prog_len - 1.
    Suggested-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
    Signed-off-by: default avatarJiong Wang <jiong.wang@netronome.com>
    Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    854dc87d
main.h 5.65 KB