On Thu, Nov 9, 2023 at 1:29 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > We will need to return ref_ctr_offsets values through link_info > interface in following change, so we need to keep them around. > > Storing ref_ctr_offsets values directly into bpf_uprobe array. > > Acked-by: Song Liu <song@xxxxxxxxxx> > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > --- Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > kernel/trace/bpf_trace.c | 14 +++----------- > 1 file changed, 3 insertions(+), 11 deletions(-) > > diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c > index d525a22b8d56..52c1ec3a0467 100644 > --- a/kernel/trace/bpf_trace.c > +++ b/kernel/trace/bpf_trace.c > @@ -3035,6 +3035,7 @@ struct bpf_uprobe_multi_link; > struct bpf_uprobe { > struct bpf_uprobe_multi_link *link; > loff_t offset; > + unsigned long ref_ctr_offset; > u64 cookie; > struct uprobe_consumer consumer; > }; > @@ -3174,7 +3175,6 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > { > struct bpf_uprobe_multi_link *link = NULL; > unsigned long __user *uref_ctr_offsets; > - unsigned long *ref_ctr_offsets = NULL; > struct bpf_link_primer link_primer; > struct bpf_uprobe *uprobes = NULL; > struct task_struct *task = NULL; > @@ -3247,18 +3247,12 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > if (!uprobes || !link) > goto error_free; > > - if (uref_ctr_offsets) { > - ref_ctr_offsets = kvcalloc(cnt, sizeof(*ref_ctr_offsets), GFP_KERNEL); > - if (!ref_ctr_offsets) > - goto error_free; > - } > - > for (i = 0; i < cnt; i++) { > if (ucookies && __get_user(uprobes[i].cookie, ucookies + i)) { > err = -EFAULT; > goto error_free; > } > - if (uref_ctr_offsets && __get_user(ref_ctr_offsets[i], uref_ctr_offsets + i)) { > + if (uref_ctr_offsets && __get_user(uprobes[i].ref_ctr_offset, uref_ctr_offsets + i)) { > err = -EFAULT; > goto error_free; > } > @@ -3289,7 +3283,7 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > for (i = 0; i < cnt; i++) { > err = uprobe_register_refctr(d_real_inode(link->path.dentry), > uprobes[i].offset, > - ref_ctr_offsets ? ref_ctr_offsets[i] : 0, > + uprobes[i].ref_ctr_offset, > &uprobes[i].consumer); > if (err) { > bpf_uprobe_unregister(&path, uprobes, i); > @@ -3301,11 +3295,9 @@ int bpf_uprobe_multi_link_attach(const union bpf_attr *attr, struct bpf_prog *pr > if (err) > goto error_free; > > - kvfree(ref_ctr_offsets); > return bpf_link_settle(&link_primer); > > error_free: > - kvfree(ref_ctr_offsets); > kvfree(uprobes); > kfree(link); > if (task) > -- > 2.41.0 >