@@ -2561,7 +2561,7 @@ struct bpf_session_run_ctx {
2561
2561
void * data ;
2562
2562
};
2563
2563
2564
- #if defined( CONFIG_FPROBE ) && defined( CONFIG_DYNAMIC_FTRACE_WITH_REGS )
2564
+ #ifdef CONFIG_FPROBE
2565
2565
struct bpf_kprobe_multi_link {
2566
2566
struct bpf_link link ;
2567
2567
struct fprobe fp ;
@@ -2584,6 +2584,13 @@ struct user_syms {
2584
2584
char * buf ;
2585
2585
};
2586
2586
2587
+ #ifndef CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS
2588
+ static DEFINE_PER_CPU (struct pt_regs , bpf_kprobe_multi_pt_regs ) ;
2589
+ #define bpf_kprobe_multi_pt_regs_ptr () this_cpu_ptr(&bpf_kprobe_multi_pt_regs)
2590
+ #else
2591
+ #define bpf_kprobe_multi_pt_regs_ptr () (NULL)
2592
+ #endif
2593
+
2587
2594
static int copy_user_syms (struct user_syms * us , unsigned long __user * usyms , u32 cnt )
2588
2595
{
2589
2596
unsigned long __user usymbol ;
@@ -2778,7 +2785,7 @@ static u64 bpf_kprobe_multi_entry_ip(struct bpf_run_ctx *ctx)
2778
2785
2779
2786
static int
2780
2787
kprobe_multi_link_prog_run (struct bpf_kprobe_multi_link * link ,
2781
- unsigned long entry_ip , struct pt_regs * regs ,
2788
+ unsigned long entry_ip , struct ftrace_regs * fregs ,
2782
2789
bool is_return , void * data )
2783
2790
{
2784
2791
struct bpf_kprobe_multi_run_ctx run_ctx = {
@@ -2790,6 +2797,7 @@ kprobe_multi_link_prog_run(struct bpf_kprobe_multi_link *link,
2790
2797
.entry_ip = entry_ip ,
2791
2798
};
2792
2799
struct bpf_run_ctx * old_run_ctx ;
2800
+ struct pt_regs * regs ;
2793
2801
int err ;
2794
2802
2795
2803
if (unlikely (__this_cpu_inc_return (bpf_prog_active ) != 1 )) {
@@ -2800,6 +2808,7 @@ kprobe_multi_link_prog_run(struct bpf_kprobe_multi_link *link,
2800
2808
2801
2809
migrate_disable ();
2802
2810
rcu_read_lock ();
2811
+ regs = ftrace_partial_regs (fregs , bpf_kprobe_multi_pt_regs_ptr ());
2803
2812
old_run_ctx = bpf_set_run_ctx (& run_ctx .session_ctx .run_ctx );
2804
2813
err = bpf_prog_run (link -> link .prog , regs );
2805
2814
bpf_reset_run_ctx (old_run_ctx );
@@ -2816,15 +2825,11 @@ kprobe_multi_link_handler(struct fprobe *fp, unsigned long fentry_ip,
2816
2825
unsigned long ret_ip , struct ftrace_regs * fregs ,
2817
2826
void * data )
2818
2827
{
2819
- struct pt_regs * regs = ftrace_get_regs (fregs );
2820
2828
struct bpf_kprobe_multi_link * link ;
2821
2829
int err ;
2822
2830
2823
- if (!regs )
2824
- return 0 ;
2825
-
2826
2831
link = container_of (fp , struct bpf_kprobe_multi_link , fp );
2827
- err = kprobe_multi_link_prog_run (link , get_entry_ip (fentry_ip ), regs , false, data );
2832
+ err = kprobe_multi_link_prog_run (link , get_entry_ip (fentry_ip ), fregs , false, data );
2828
2833
return is_kprobe_session (link -> link .prog ) ? err : 0 ;
2829
2834
}
2830
2835
@@ -2834,13 +2839,9 @@ kprobe_multi_link_exit_handler(struct fprobe *fp, unsigned long fentry_ip,
2834
2839
void * data )
2835
2840
{
2836
2841
struct bpf_kprobe_multi_link * link ;
2837
- struct pt_regs * regs = ftrace_get_regs (fregs );
2838
-
2839
- if (!regs )
2840
- return ;
2841
2842
2842
2843
link = container_of (fp , struct bpf_kprobe_multi_link , fp );
2843
- kprobe_multi_link_prog_run (link , get_entry_ip (fentry_ip ), regs , true, data );
2844
+ kprobe_multi_link_prog_run (link , get_entry_ip (fentry_ip ), fregs , true, data );
2844
2845
}
2845
2846
2846
2847
static int symbols_cmp_r (const void * a , const void * b , const void * priv )
@@ -3101,7 +3102,7 @@ int bpf_kprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr
3101
3102
kvfree (cookies );
3102
3103
return err ;
3103
3104
}
3104
- #else /* !CONFIG_FPROBE || !CONFIG_DYNAMIC_FTRACE_WITH_REGS */
3105
+ #else /* !CONFIG_FPROBE */
3105
3106
int bpf_kprobe_multi_link_attach (const union bpf_attr * attr , struct bpf_prog * prog )
3106
3107
{
3107
3108
return - EOPNOTSUPP ;
0 commit comments