]> git.baikalelectronics.ru Git - kernel.git/commit
sparc: Fix JIT fused branch convergance.
authorDavid Miller <davem@davemloft.net>
Mon, 26 Nov 2018 21:03:46 +0000 (13:03 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 27 Nov 2018 01:48:36 +0000 (17:48 -0800)
commit377d3801d86215a2ea4f9227e0841c9431ba8638
tree2a4e4f7f9205412e7f84e2d1101fa6ca78cd7931
parentc278ea3cf5454f3a5cc5a6533572781534aaa625
sparc: Fix JIT fused branch convergance.

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: a05681e51d07 ("bpf: implement ld_abs/ld_ind in native bpf")
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
arch/sparc/net/bpf_jit_comp_64.c