bpf: Store ref_ctr_offsets values in bpf_uprobe array
[linux-2.6-microblaze.git] / kernel / trace / bpf_trace.c
index f0b8b7c..ad0323f 100644 (file)
@@ -3033,6 +3033,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;
 };
@@ -3172,7 +3173,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;
@@ -3245,18 +3245,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;
                }
@@ -3287,7 +3281,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);
@@ -3299,11 +3293,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)