• David Miller's avatar
    sparc: Fix JIT fused branch convergance. · c44768a3
    David Miller authored
    On T4 and later sparc64 cpus we can use the fused compare and branch
    instruction.
    
    However, it can only be used if the branch destination is in the range
    of a signed 10-bit immediate offset.  This amounts to 1024
    instructions forwards or backwards.
    
    After the commit referenced in the Fixes: tag, the largest possible
    size program seen by the JIT explodes by a significant factor.
    
    As a result of this convergance takes many more passes since the
    expanded "BPF_LDX | BPF_MSH | BPF_B" code sequence, for example,
    contains several embedded branch on condition instructions.
    
    On each pass, as suddenly new fused compare and branch instances
    become valid, this makes thousands more in range for the next pass.
    And so on and so forth.
    
    This is most greatly exemplified by "BPF_MAXINSNS: exec all MSH" which
    takes 35 passes to converge, and shrinks the image by about 64K.
    
    To decrease the cost of this number of convergance passes, do the
    convergance pass before we have the program image allocated, just like
    other JITs (such as x86) do.
    
    Fixes: e0cea7ce ("bpf: implement ld_abs/ld_ind in native bpf")
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    c44768a3
bpf_jit_comp_64.c 37 KB