Hi! This set adds support for complete removal of dead code.
Patch 3 contains all the code removal logic, patches 2 and 4 additionally optimize branches around and to dead code. Patches 6 and 7 allow offload JITs to take advantage of the optimization. After a few small clean ups (8, 9, 10) nfp support is added (11, 12). Removing code directly in the verifier makes it easy to adjust the relevant metadata (line info, subprogram info). JITs for code store constrained architectures would have hard time performing such adjustments at JIT level. Removing subprograms or line info is very hard once BPF core finished the verification. For user space to perform dead code removal it would have to perform the execution simulation/analysis similar to what the verifier does. v3: - fix uninitilized var warning in GCC 6 (buildbot). Jakub Kicinski (12): bpf: change parameters of call/branch offset adjustment bpf: verifier: hard wire branches to dead code bpf: verifier: remove dead code bpf: verifier: remove unconditional branches by 0 selftests: bpf: add tests for dead code removal bpf: verifier: record original instruction index bpf: notify offload JITs about optimizations nfp: bpf: don't use instruction number for jump target nfp: bpf: split up the skip flag nfp: bpf: save original program length nfp: bpf: support optimizing dead branches nfp: bpf: support removing dead code drivers/net/ethernet/netronome/nfp/bpf/jit.c | 42 +- drivers/net/ethernet/netronome/nfp/bpf/main.h | 33 +- .../net/ethernet/netronome/nfp/bpf/offload.c | 9 +- .../net/ethernet/netronome/nfp/bpf/verifier.c | 74 +++- include/linux/bpf.h | 7 + include/linux/bpf_verifier.h | 6 + include/linux/filter.h | 1 + kernel/bpf/core.c | 52 ++- kernel/bpf/offload.c | 35 ++ kernel/bpf/verifier.c | 277 ++++++++++++- tools/testing/selftests/bpf/test_btf.c | 364 +++++++++++++++++- tools/testing/selftests/bpf/test_verifier.c | 160 ++++++++ 12 files changed, 993 insertions(+), 67 deletions(-) -- 2.19.2