On Tue, 2022-04-12 at 19:43 -0700, Andrii Nakryiko wrote: > On Tue, Apr 12, 2022 at 9:56 AM Kui-Feng Lee <kuifeng@xxxxxx> wrote: > > > > Replace struct bpf_tramp_progs with struct bpf_tramp_links to > > collect > > struct bpf_tramp_link(s) for a trampoline. struct bpf_tramp_link > > extends bpf_link to act as a linked list node. > > > > arch_prepare_bpf_trampoline() accepts a struct bpf_tramp_links to > > collects all bpf_tramp_link(s) that a trampoline should call. > > > > Change BPF trampoline and bpf_struct_ops to pass bpf_tramp_links > > instead of bpf_tramp_progs. > > > > Signed-off-by: Kui-Feng Lee <kuifeng@xxxxxx> > > --- > > Looks good, see two comments below. > > Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > > arch/x86/net/bpf_jit_comp.c | 36 +++++++++-------- > > include/linux/bpf.h | 38 ++++++++++++------ > > include/linux/bpf_types.h | 1 + > > include/uapi/linux/bpf.h | 1 + > > kernel/bpf/bpf_struct_ops.c | 69 ++++++++++++++++++++++-------- > > -- > > kernel/bpf/syscall.c | 23 ++++------- > > kernel/bpf/trampoline.c | 73 +++++++++++++++++++----------- > > ---- > > net/bpf/bpf_dummy_struct_ops.c | 35 +++++++++++++--- > > tools/bpf/bpftool/link.c | 1 + > > tools/include/uapi/linux/bpf.h | 1 + > > 10 files changed, 175 insertions(+), 103 deletions(-) > > > > [...] > > > /* Different use cases for BPF trampoline: > > @@ -704,7 +704,7 @@ struct bpf_tramp_progs { > > struct bpf_tramp_image; > > int arch_prepare_bpf_trampoline(struct bpf_tramp_image *tr, void > > *image, void *image_end, > > const struct btf_func_model *m, u32 > > flags, > > - struct bpf_tramp_progs *tprogs, > > + struct bpf_tramp_links *tlinks, > > void *orig_call); > > /* these two functions are called from generated trampoline */ > > u64 notrace __bpf_prog_enter(struct bpf_prog *prog); > > @@ -803,9 +803,12 @@ static __always_inline __nocfi unsigned int > > bpf_dispatcher_nop_func( > > { > > return bpf_func(ctx, insnsi); > > } > > + > > +struct bpf_link; > > + > > is this forward declaration still needed? was it supposed to be a > struct bpf_tramp_link instead? and also probably higher above, before > bpf_tramp_links? You are right, I should remvoe it. > > > #ifdef CONFIG_BPF_JIT > > -int bpf_trampoline_link_prog(struct bpf_prog *prog, struct > > bpf_trampoline *tr); > > -int bpf_trampoline_unlink_prog(struct bpf_prog *prog, struct > > bpf_trampoline *tr); > > +int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct > > bpf_trampoline *tr); > > +int bpf_trampoline_unlink_prog(struct bpf_tramp_link *link, struct > > bpf_trampoline *tr); > > struct bpf_trampoline *bpf_trampoline_get(u64 key, > > struct > > bpf_attach_target_info *tgt_info); > > void bpf_trampoline_put(struct bpf_trampoline *tr); > > @@ -856,12 +859,12 @@ int bpf_jit_charge_modmem(u32 size); > > void bpf_jit_uncharge_modmem(u32 size); > > bool bpf_prog_has_trampoline(const struct bpf_prog *prog); > > #else > > -static inline int bpf_trampoline_link_prog(struct bpf_prog *prog, > > +static inline int bpf_trampoline_link_prog(struct bpf_tramp_link > > *link, > > struct bpf_trampoline > > *tr) > > { > > return -ENOTSUPP; > > } > > -static inline int bpf_trampoline_unlink_prog(struct bpf_prog > > *prog, > > +static inline int bpf_trampoline_unlink_prog(struct bpf_tramp_link > > *link, > > struct bpf_trampoline > > *tr) > > { > > return -ENOTSUPP; > > @@ -960,7 +963,6 @@ struct bpf_prog_aux { > > bool tail_call_reachable; > > bool xdp_has_frags; > > bool use_bpf_prog_pack; > > - struct hlist_node tramp_hlist; > > /* BTF_KIND_FUNC_PROTO for valid attach_btf_id */ > > const struct btf_type *attach_func_proto; > > /* function name for valid attach_btf_id */ > > @@ -1047,6 +1049,18 @@ struct bpf_link_ops { > > struct bpf_link_info *info); > > }; > > > > +struct bpf_tramp_link { > > + struct bpf_link link; > > + struct hlist_node tramp_hlist; > > +}; > > + > > https://docs.google.com/document/d/1FYYdi1Hw4pjulbkvI1VmG-kGqTJRCg7bh1vAF4bwjMc/edit?usp=sharing > > +struct bpf_tracing_link { > > + struct bpf_tramp_link link; > > + enum bpf_attach_type attach_type; > > + struct bpf_trampoline *trampoline; > > + struct bpf_prog *tgt_prog; > > +}; > > struct bpf_tracing_link can stay in syscall.c, no? don't see anyone > needing it outside of syscall.c It will be used by invoke_bpf_prog() of bpf_jit_comp.c in the 3rd patch to get the cookie value. > > > + > > struct bpf_link_primer { > > struct bpf_link *link; > > struct file *file; > > @@ -1084,8 +1098,8 @@ bool bpf_struct_ops_get(const void *kdata); > > void bpf_struct_ops_put(const void *kdata); > > int bpf_struct_ops_map_sys_lookup_elem(struct bpf_map *map, void > > *key, > > void *value); > > -int bpf_struct_ops_prepare_trampoline(struct bpf_tramp_progs > > *tprogs, > > - struct bpf_prog *prog, > > +int bpf_struct_ops_prepare_trampoline(struct bpf_tramp_links > > *tlinks, > > + struct bpf_tramp_link *link, > > const struct btf_func_model > > *model, > > void *image, void *image_end); > > [...]