Re: [PATCHv2 bpf-next 2/6] bpf: Store ref_ctr_offsets values in bpf_uprobe array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux