bpf trampoline for arm64
| From: | Xu Kuohai <xukuohai-AT-huawei.com> | |
| To: | <bpf-AT-vger.kernel.org>, <linux-arm-kernel-AT-lists.infradead.org>, <linux-kernel-AT-vger.kernel.org>, <netdev-AT-vger.kernel.org>, <linux-kselftest-AT-vger.kernel.org> | |
| Subject: | [PATCH bpf-next v4 0/6] bpf trampoline for arm64 | |
| Date: | Tue, 17 May 2022 03:18:32 -0400 | |
| Message-ID: | <20220517071838.3366093-1-xukuohai@huawei.com> | |
| Cc: | Catalin Marinas <catalin.marinas-AT-arm.com>, Will Deacon <will-AT-kernel.org>, Steven Rostedt <rostedt-AT-goodmis.org>, Ingo Molnar <mingo-AT-redhat.com>, Daniel Borkmann <daniel-AT-iogearbox.net>, Alexei Starovoitov <ast-AT-kernel.org>, Zi Shen Lim <zlim.lnx-AT-gmail.com>, Andrii Nakryiko <andrii-AT-kernel.org>, Martin KaFai Lau <kafai-AT-fb.com>, Song Liu <songliubraving-AT-fb.com>, Yonghong Song <yhs-AT-fb.com>, John Fastabend <john.fastabend-AT-gmail.com>, KP Singh <kpsingh-AT-kernel.org>, "David S . Miller" <davem-AT-davemloft.net>, Hideaki YOSHIFUJI <yoshfuji-AT-linux-ipv6.org>, David Ahern <dsahern-AT-kernel.org>, Thomas Gleixner <tglx-AT-linutronix.de>, Borislav Petkov <bp-AT-alien8.de>, Dave Hansen <dave.hansen-AT-linux.intel.com>, <x86-AT-kernel.org>, <hpa-AT-zytor.com>, Shuah Khan <shuah-AT-kernel.org>, Jakub Kicinski <kuba-AT-kernel.org>, Jesper Dangaard Brouer <hawk-AT-kernel.org>, Mark Rutland <mark.rutland-AT-arm.com>, Pasha Tatashin <pasha.tatashin-AT-soleen.com>, Ard Biesheuvel <ardb-AT-kernel.org>, Daniel Kiss <daniel.kiss-AT-arm.com>, Steven Price <steven.price-AT-arm.com>, Sudeep Holla <sudeep.holla-AT-arm.com>, Marc Zyngier <maz-AT-kernel.org>, Peter Collingbourne <pcc-AT-google.com>, Mark Brown <broonie-AT-kernel.org>, Delyan Kratunov <delyank-AT-fb.com>, Kumar Kartikeya Dwivedi <memxor-AT-gmail.com> | |
| Archive-link: | Article |
Add bpf trampoline support for arm64. Most of the logic is the same as x86. Tested on raspberry pi 4b and qemu with KASLR disabled (avoid long jump), result: #9 /1 bpf_cookie/kprobe:OK #9 /2 bpf_cookie/multi_kprobe_link_api:FAIL #9 /3 bpf_cookie/multi_kprobe_attach_api:FAIL #9 /4 bpf_cookie/uprobe:OK #9 /5 bpf_cookie/tracepoint:OK #9 /6 bpf_cookie/perf_event:OK #9 /7 bpf_cookie/trampoline:OK #9 /8 bpf_cookie/lsm:OK #9 bpf_cookie:FAIL #18 /1 bpf_tcp_ca/dctcp:OK #18 /2 bpf_tcp_ca/cubic:OK #18 /3 bpf_tcp_ca/invalid_license:OK #18 /4 bpf_tcp_ca/dctcp_fallback:OK #18 /5 bpf_tcp_ca/rel_setsockopt:OK #18 bpf_tcp_ca:OK #51 /1 dummy_st_ops/dummy_st_ops_attach:OK #51 /2 dummy_st_ops/dummy_init_ret_value:OK #51 /3 dummy_st_ops/dummy_init_ptr_arg:OK #51 /4 dummy_st_ops/dummy_multiple_args:OK #51 dummy_st_ops:OK #55 fentry_fexit:OK #56 fentry_test:OK #57 /1 fexit_bpf2bpf/target_no_callees:OK #57 /2 fexit_bpf2bpf/target_yes_callees:OK #57 /3 fexit_bpf2bpf/func_replace:OK #57 /4 fexit_bpf2bpf/func_replace_verify:OK #57 /5 fexit_bpf2bpf/func_sockmap_update:OK #57 /6 fexit_bpf2bpf/func_replace_return_code:OK #57 /7 fexit_bpf2bpf/func_map_prog_compatibility:OK #57 /8 fexit_bpf2bpf/func_replace_multi:OK #57 /9 fexit_bpf2bpf/fmod_ret_freplace:OK #57 fexit_bpf2bpf:OK #58 fexit_sleep:OK #59 fexit_stress:OK #60 fexit_test:OK #67 get_func_args_test:OK #68 get_func_ip_test:OK #104 modify_return:OK #237 xdp_bpf2bpf:OK bpf_cookie/multi_kprobe_link_api and bpf_cookie/multi_kprobe_attach_api failed due to lack of multi_kprobe on arm64. v4: - Run the test cases on raspberry pi 4b - Rebase and add cookie to trampoline - As Steve suggested, move trace_direct_tramp() back to entry-ftrace.S to avoid messing up generic code with architecture specific code - As Jakub suggested, merge patch 4 and patch 5 of v3 to provide full function in one patch - As Mark suggested, add a comment for the use of aarch64_insn_patch_text_nosync() - Do not generate trampoline for long jump to avoid triggering ftrace_bug - Round stack size to multiples of 16B to avoid SPAlignmentFault - Use callee saved register x20 to reduce the use of mov_i64 - Add missing BTI J instructions - Trivial spelling and code sytle fixes v3: https://lore.kernel.org/bpf/20220424154028.1698685-1-xuku... - Append test results for bpf_tcp_ca, dummy_st_ops, fexit_bpf2bpf, xdp_bpf2bpf - Support to poke bpf progs - Fix return value of arch_prepare_bpf_trampoline() to the total number of bytes instead of number of instructions - Do not check whether CONFIG_DYNAMIC_FTRACE_WITH_REGS is enabled in arch_prepare_bpf_trampoline, since the trampoline may be hooked to a bpf prog - Restrict bpf_arch_text_poke() to poke bpf text only, as kernel functions are poked by ftrace - Rewrite trace_direct_tramp() in inline assembly in trace_selftest.c to avoid messing entry-ftrace.S - isolate arch_ftrace_set_direct_caller() with macro CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS to avoid compile error when this macro is disabled - Some trivial code sytle fixes v2: https://lore.kernel.org/bpf/20220414162220.1985095-1-xuku... - Add Song's ACK - Change the multi-line comment in is_valid_bpf_tramp_flags() into net style (patch 3) - Fix a deadloop issue in ftrace selftest (patch 2) - Replace pt_regs->x0 with pt_regs->orig_x0 in patch 1 commit message - Replace "bpf trampoline" with "custom trampoline" in patch 1, as ftrace direct call is not only used by bpf trampoline. v1: https://lore.kernel.org/bpf/20220413054959.1053668-1-xuku... Xu Kuohai (6): arm64: ftrace: Add ftrace direct call support ftrace: Fix deadloop caused by direct call in ftrace selftest bpf: Move is_valid_bpf_tramp_flags() to the public trampoline code bpf, arm64: Impelment bpf_arch_text_poke() for arm64 bpf, arm64: bpf trampoline for arm64 selftests/bpf: Fix trivial typo in fentry_fexit.c arch/arm64/Kconfig | 2 + arch/arm64/include/asm/ftrace.h | 22 + arch/arm64/kernel/asm-offsets.c | 1 + arch/arm64/kernel/entry-ftrace.S | 28 +- arch/arm64/net/bpf_jit.h | 1 + arch/arm64/net/bpf_jit_comp.c | 523 +++++++++++++++++- arch/x86/net/bpf_jit_comp.c | 20 - include/linux/bpf.h | 6 + kernel/bpf/bpf_struct_ops.c | 4 +- kernel/bpf/trampoline.c | 34 +- kernel/trace/trace_selftest.c | 2 + .../selftests/bpf/prog_tests/fentry_fexit.c | 4 +- 12 files changed, 603 insertions(+), 44 deletions(-) -- 2.30.2
