Now that we split trampoline attachment object (bpf_tramp_node) from
the link object (bpf_tramp_link) we can use bpf_tramp_node as fsession's
fexit attachment object and get rid of the bpf_fsession_link object.

Signed-off-by: Jiri Olsa <[email protected]>
---
 include/linux/bpf.h     |  6 +-----
 kernel/bpf/syscall.c    | 21 ++++++---------------
 kernel/bpf/trampoline.c | 14 +++++++-------
 3 files changed, 14 insertions(+), 27 deletions(-)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 9c7f5ab3c7ce..d79951c0ab79 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1883,15 +1883,11 @@ struct bpf_shim_tramp_link {
 
 struct bpf_tracing_link {
        struct bpf_tramp_link link;
+       struct bpf_tramp_node fexit;
        struct bpf_trampoline *trampoline;
        struct bpf_prog *tgt_prog;
 };
 
-struct bpf_fsession_link {
-       struct bpf_tracing_link link;
-       struct bpf_tramp_link fexit;
-};
-
 struct bpf_raw_tp_link {
        struct bpf_link link;
        struct bpf_raw_event_map *btp;
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index e9d482c59977..95a4bfbeab62 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -3637,21 +3637,7 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
                key = bpf_trampoline_compute_key(tgt_prog, NULL, btf_id);
        }
 
-       if (prog->expected_attach_type == BPF_TRACE_FSESSION) {
-               struct bpf_fsession_link *fslink;
-
-               fslink = kzalloc(sizeof(*fslink), GFP_USER);
-               if (fslink) {
-                       bpf_tramp_link_init(&fslink->fexit, 
BPF_LINK_TYPE_TRACING,
-                                           &bpf_tracing_link_lops, prog, 
attach_type,
-                                           bpf_cookie);
-                       link = &fslink->link;
-               } else {
-                       link = NULL;
-               }
-       } else {
-               link = kzalloc(sizeof(*link), GFP_USER);
-       }
+       link = kzalloc(sizeof(*link), GFP_USER);
        if (!link) {
                err = -ENOMEM;
                goto out_put_prog;
@@ -3659,6 +3645,11 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
        bpf_tramp_link_init(&link->link, BPF_LINK_TYPE_TRACING,
                            &bpf_tracing_link_lops, prog, attach_type, 
bpf_cookie);
 
+       if (prog->expected_attach_type == BPF_TRACE_FSESSION) {
+               link->fexit.link = &link->link.link;
+               link->fexit.cookie = bpf_cookie;
+       }
+
        mutex_lock(&prog->aux->dst_mutex);
 
        /* There are a few possible cases here:
diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c
index f4acf3771600..14fa7012738a 100644
--- a/kernel/bpf/trampoline.c
+++ b/kernel/bpf/trampoline.c
@@ -827,7 +827,7 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_node 
*node,
                                      struct bpf_trampoline_ops *ops,
                                      void *data)
 {
-       struct bpf_fsession_link *fslink = NULL;
+       struct bpf_tracing_link *tr_link = NULL;
        enum bpf_tramp_prog_type kind;
        struct bpf_tramp_node *node_existing;
        struct hlist_head *prog_list;
@@ -877,8 +877,8 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_node 
*node,
        hlist_add_head(&node->tramp_hlist, prog_list);
        if (kind == BPF_TRAMP_FSESSION) {
                tr->progs_cnt[BPF_TRAMP_FENTRY]++;
-               fslink = container_of(node, struct bpf_fsession_link, 
link.link.node);
-               hlist_add_head(&fslink->fexit.node.tramp_hlist, 
&tr->progs_hlist[BPF_TRAMP_FEXIT]);
+               tr_link = container_of(node, struct bpf_tracing_link, 
link.node);
+               hlist_add_head(&tr_link->fexit.tramp_hlist, 
&tr->progs_hlist[BPF_TRAMP_FEXIT]);
                tr->progs_cnt[BPF_TRAMP_FEXIT]++;
        } else {
                tr->progs_cnt[kind]++;
@@ -888,7 +888,7 @@ static int __bpf_trampoline_link_prog(struct bpf_tramp_node 
*node,
                hlist_del_init(&node->tramp_hlist);
                if (kind == BPF_TRAMP_FSESSION) {
                        tr->progs_cnt[BPF_TRAMP_FENTRY]--;
-                       hlist_del_init(&fslink->fexit.node.tramp_hlist);
+                       hlist_del_init(&tr_link->fexit.tramp_hlist);
                        tr->progs_cnt[BPF_TRAMP_FEXIT]--;
                } else {
                        tr->progs_cnt[kind]--;
@@ -929,10 +929,10 @@ static int __bpf_trampoline_unlink_prog(struct 
bpf_tramp_node *node,
                tgt_prog->aux->is_extended = false;
                return err;
        } else if (kind == BPF_TRAMP_FSESSION) {
-               struct bpf_fsession_link *fslink =
-                       container_of(node, struct bpf_fsession_link, 
link.link.node);
+               struct bpf_tracing_link *tr_link =
+                       container_of(node, struct bpf_tracing_link, link.node);
 
-               hlist_del_init(&fslink->fexit.node.tramp_hlist);
+               hlist_del_init(&tr_link->fexit.tramp_hlist);
                tr->progs_cnt[BPF_TRAMP_FEXIT]--;
                kind = BPF_TRAMP_FENTRY;
        }
-- 
2.52.0


Reply via email to