-
Notifications
You must be signed in to change notification settings - Fork 151
bpf trampoline support "jmp" mode #10326
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: bpf-next_base
Are you sure you want to change the base?
Conversation
|
Upstream branch: 7dc211c |
AI reviewed your patch. Please fix the bug or email reply why it's not a bug. In-Reply-To-Subject: |
|
Forwarding comment 3547646897 via email |
1efb39d to
5b97b4a
Compare
|
Upstream branch: ec12ab2 |
bb79c89 to
fcfe86b
Compare
5b97b4a to
7b6b51d
Compare
|
Upstream branch: d6ec090 |
fcfe86b to
9b6d545
Compare
7b6b51d to
2412df8
Compare
|
Upstream branch: d6ec090 |
9b6d545 to
52531b3
Compare
2412df8 to
bfb0726
Compare
|
Upstream branch: d088da9 |
52531b3 to
7ce0da9
Compare
bfb0726 to
b0a5b86
Compare
|
Upstream branch: e0940c6 |
7ce0da9 to
5d34b76
Compare
b0a5b86 to
44cbecf
Compare
|
Upstream branch: 792f258 |
5d34b76 to
9b5ad28
Compare
44cbecf to
e8ba78a
Compare
|
Upstream branch: 878ee3c |
9b5ad28 to
1e09337
Compare
e8ba78a to
c1a1f03
Compare
|
Upstream branch: ae24fc8 |
1e09337 to
189c634
Compare
c1a1f03 to
ca453f8
Compare
|
Upstream branch: 4dd3a48 |
189c634 to
a9d8971
Compare
ca453f8 to
b3f74e5
Compare
|
Upstream branch: 8f7cf30 |
a9d8971 to
810d544
Compare
b3f74e5 to
b57110f
Compare
For now, the "nop" will be replaced with a "call" instruction when a function is hooked by the ftrace. However, sometimes the "call" can break the RSB and introduce extra overhead. Therefore, introduce the flag FTRACE_OPS_FL_JMP, which indicate that the ftrace_ops should be called with a "jmp" instead of "call". For now, it is only used by the direct call case. When a direct ftrace_ops is marked with FTRACE_OPS_FL_JMP, the last bit of the ops->direct_call will be set to 1. Therefore, we can tell if we should use "jmp" for the callback in ftrace_call_replace(). Signed-off-by: Menglong Dong <[email protected]>
Implement the DYNAMIC_FTRACE_WITH_JMP for x86_64. In ftrace_call_replace,
we will use JMP32_INSN_OPCODE instead of CALL_INSN_OPCODE if the address
should use "jmp".
Meanwhile, adjust the direct call in the ftrace_regs_caller. The RSB is
balanced in the "jmp" mode. Take the function "foo" for example:
original_caller:
call foo -> foo:
call fentry -> fentry:
[do ftrace callbacks ]
move tramp_addr to stack
RET -> tramp_addr
tramp_addr:
[..]
call foo_body -> foo_body:
[..]
RET -> back to tramp_addr
[..]
RET -> back to original_caller
Signed-off-by: Menglong Dong <[email protected]>
Some places calculate the origin_call by checking if BPF_TRAMP_F_SKIP_FRAME is set. However, it should use BPF_TRAMP_F_ORIG_STACK for this propose. Just fix them. Signed-off-by: Menglong Dong <[email protected]> Acked-by: Alexei Starovoitov <[email protected]>
In the origin call case, if BPF_TRAMP_F_SKIP_FRAME is not set, it means that the trampoline is not called, but "jmp". Introduce the function bpf_trampoline_use_jmp() to check if the trampoline is in "jmp" mode. Do some adjustment on the "jmp" mode for the x86_64. The main adjustment that we make is for the stack parameter passing case, as the stack alignment logic changes in the "jmp" mode without the "rip". What's more, the location of the parameters on the stack also changes. Signed-off-by: Menglong Dong <[email protected]>
|
Upstream branch: c427320 |
In the origin logic, the bpf_arch_text_poke() assume that the old and new instructions have the same opcode. However, they can have different opcode if we want to replace a "call" insn with a "jmp" insn. Therefore, add the new function parameter "old_t" along with the "new_t", which are used to indicate the old and new poke type. Meanwhile, adjust the implement of bpf_arch_text_poke() for all the archs. "BPF_MOD_NOP" is added to make the code more readable. In bpf_arch_text_poke(), we still check if the new and old address is NULL to determine if nop insn should be used, which I think is more safe. Signed-off-by: Menglong Dong <[email protected]>
Implement the "jmp" mode for the bpf trampoline. For the ftrace_managed case, we need only to set the FTRACE_OPS_FL_JMP on the tr->fops if "jmp" is needed. For the bpf poke case, we will check the origin poke type with the "origin_flags", and current poke type with "tr->flags". The function bpf_trampoline_update_fentry() is introduced to do the job. The "jmp" mode will only be enabled with CONFIG_DYNAMIC_FTRACE_WITH_JMP enabled and BPF_TRAMP_F_SHARE_IPMODIFY is not set. With BPF_TRAMP_F_SHARE_IPMODIFY, we need to get the origin call ip from the stack, so we can't use the "jmp" mode. Signed-off-by: Menglong Dong <[email protected]>
810d544 to
21c5337
Compare
Pull request for series with
subject: bpf trampoline support "jmp" mode
version: 3
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1024844