@@ -2508,20 +2508,19 @@ static void load_imm64(struct bpf_jit *jit, int dst_reg, u64 val)
25082508
25092509static int invoke_bpf_prog (struct bpf_tramp_jit * tjit ,
25102510 const struct btf_func_model * m ,
2511- struct bpf_tramp_link * tlink , bool save_ret )
2511+ struct bpf_prog * p , u64 cookie , bool save_ret )
25122512{
25132513 struct bpf_jit * jit = & tjit -> common ;
25142514 int cookie_off = tjit -> run_ctx_off +
25152515 offsetof(struct bpf_tramp_run_ctx , bpf_cookie );
2516- struct bpf_prog * p = tlink -> link .prog ;
25172516 int patch ;
25182517
25192518 /*
2520- * run_ctx.cookie = tlink-> cookie;
2519+ * run_ctx.cookie = cookie;
25212520 */
25222521
2523- /* %r0 = tlink-> cookie */
2524- load_imm64 (jit , REG_W0 , tlink -> cookie );
2522+ /* %r0 = cookie */
2523+ load_imm64 (jit , REG_W0 , cookie );
25252524 /* stg %r0,cookie_off(%r15) */
25262525 EMIT6_DISP_LH (0xe3000000 , 0x0024 , REG_W0 , REG_0 , REG_15 , cookie_off );
25272526
@@ -2768,7 +2767,8 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
27682767 }
27692768
27702769 for (i = 0 ; i < fentry -> nr_links ; i ++ )
2771- if (invoke_bpf_prog (tjit , m , fentry -> links [i ],
2770+ if (invoke_bpf_prog (tjit , m , bpf_tramp_links_prog (fentry , i ),
2771+ fentry -> links [i ]-> cookie ,
27722772 flags & BPF_TRAMP_F_RET_FENTRY_RET ))
27732773 return - EINVAL ;
27742774
@@ -2782,7 +2782,9 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
27822782 0xf000 | tjit -> retval_off );
27832783
27842784 for (i = 0 ; i < fmod_ret -> nr_links ; i ++ ) {
2785- if (invoke_bpf_prog (tjit , m , fmod_ret -> links [i ], true))
2785+ if (invoke_bpf_prog (tjit , m ,
2786+ bpf_tramp_links_prog (fmod_ret , i ),
2787+ fmod_ret -> links [i ]-> cookie , true))
27862788 return - EINVAL ;
27872789
27882790 /*
@@ -2850,7 +2852,8 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
28502852 /* do_fexit: */
28512853 tjit -> do_fexit = jit -> prg ;
28522854 for (i = 0 ; i < fexit -> nr_links ; i ++ )
2853- if (invoke_bpf_prog (tjit , m , fexit -> links [i ], false))
2855+ if (invoke_bpf_prog (tjit , m , bpf_tramp_links_prog (fexit , i ),
2856+ fexit -> links [i ]-> cookie , false))
28542857 return - EINVAL ;
28552858
28562859 if (flags & BPF_TRAMP_F_CALL_ORIG ) {
@@ -2946,6 +2949,11 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image,
29462949 return ret < 0 ? ret : tjit .common .prg ;
29472950}
29482951
2952+ bool bpf_trampoline_supports_update_prog (void )
2953+ {
2954+ return true;
2955+ }
2956+
29492957bool bpf_jit_supports_subprog_tailcalls (void )
29502958{
29512959 return true;
0 commit comments