- 
                Notifications
    
You must be signed in to change notification settings  - Fork 147
 
Fix ftrace for livepatch + BPF fexit programs #10118
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
Conversation
| 
           Upstream branch: 8ce93aa  | 
    
986b6fd    to
    87c66e9      
    Compare
  
    | 
           Upstream branch: 2cbb259  | 
    
e1e56a7    to
    e79d44e      
    Compare
  
    87c66e9    to
    6f7697d      
    Compare
  
    | 
           Upstream branch: 14a7f23  | 
    
e79d44e    to
    53ffcd0      
    Compare
  
    6f7697d    to
    55ff712      
    Compare
  
    | 
           Upstream branch: be708ed  | 
    
53ffcd0    to
    b978fd4      
    Compare
  
    55ff712    to
    1af0040      
    Compare
  
    | 
           Upstream branch: ba36dd5  | 
    
b978fd4    to
    55aa10c      
    Compare
  
    1af0040    to
    7ea1d98      
    Compare
  
    | 
           Upstream branch: 6146a0f  | 
    
When livepatch is attached to the same function as bpf trampoline with
a fexit program, bpf trampoline code calls register_ftrace_direct()
twice. The first time will fail with -EAGAIN, and the second time it
will succeed. This requires register_ftrace_direct() to unregister
the address on the first attempt. Otherwise, the bpf trampoline cannot
attach. Here is an easy way to reproduce this issue:
  insmod samples/livepatch/livepatch-sample.ko
  bpftrace -e 'fexit:cmdline_proc_show {}'
  ERROR: Unable to attach probe: fexit:vmlinux:cmdline_proc_show...
Fix this by cleaning up the hash when register_ftrace_function_nolock hits
errors.
Also, move the code that resets ops->func and ops->trampoline to the error
path of register_ftrace_direct(); and add a helper function reset_direct()
in register_ftrace_direct() and unregister_ftrace_direct().
Fixes: d05cb47 ("ftrace: Fix modification of direct_function hash while in use")
Cc: [email protected] # v6.6+
Reported-by: Andrey Grodzovsky <[email protected]>
Closes: https://lore.kernel.org/live-patching/[email protected]/
Cc: Steven Rostedt (Google) <[email protected]>
Cc: Masami Hiramatsu (Google) <[email protected]>
Acked-and-tested-by: Andrey Grodzovsky <[email protected]>
Signed-off-by: Song Liu <[email protected]>
Reviewed-by: Jiri Olsa <[email protected]>
    ftrace_hash_ipmodify_enable() checks IPMODIFY and DIRECT ftrace_ops on the same kernel function. When needed, ftrace_hash_ipmodify_enable() calls ops->ops_func() to prepare the direct ftrace (BPF trampoline) to share the same function as the IPMODIFY ftrace (livepatch). ftrace_hash_ipmodify_enable() is called in register_ftrace_direct() path, but not called in modify_ftrace_direct() path. As a result, the following operations will break livepatch: 1. Load livepatch to a kernel function; 2. Attach fentry program to the kernel function; 3. Attach fexit program to the kernel function. After 3, the kernel function being used will not be the livepatched version, but the original version. Fix this by adding __ftrace_hash_update_ipmodify() to __modify_ftrace_direct() and adjust some logic around the call. Signed-off-by: Song Liu <[email protected]> Reviewed-by: Jiri Olsa <[email protected]>
Both livepatch and BPF trampoline use ftrace. Special attention is needed
when livepatch and fexit program touch the same function at the same
time, because livepatch updates a kernel function and the BPF trampoline
need to call into the right version of the kernel function.
Use samples/livepatch/livepatch-sample.ko for the test.
The test covers two cases:
  1) When a fentry program is loaded first. This exercises the
     modify_ftrace_direct code path.
  2) When a fentry program is loaded first. This exercises the
     register_ftrace_direct code path.
Signed-off-by: Song Liu <[email protected]>
Reviewed-by: Jiri Olsa <[email protected]>
    55aa10c    to
    aebeefa      
    Compare
  
    7ea1d98    to
    8b55cb4      
    Compare
  
    | 
           At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=1016392 irrelevant now. Closing PR.  | 
    
Pull request for series with
subject: Fix ftrace for livepatch + BPF fexit programs
version: 4
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1016392