]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Factor fsession link to use struct bpf_tramp_node
authorJiri Olsa <jolsa@kernel.org>
Sat, 6 Jun 2026 12:39:34 +0000 (14:39 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 7 Jun 2026 17:03:01 +0000 (10:03 -0700)
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 <jolsa@kernel.org>
Link: https://lore.kernel.org/r/20260606123955.345967-10-jolsa@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf.h
kernel/bpf/syscall.c
kernel/bpf/trampoline.c

index 6ff35491d9c0f1492595e3b974dd23debfe47702..428789a9e736922ab72d525c9295db9f8ca5cd74 100644 (file)
@@ -1927,15 +1927,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;
index fd69fdb9290b344032eab75f1f2ea798d3a87b13..0cfc8bcb3dc9f33ee9d7acd4a03a626c4fcea9c9 100644 (file)
@@ -3730,21 +3730,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_obj(*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_obj(*link, GFP_USER);
-       }
+       link = kzalloc_obj(*link, GFP_USER);
        if (!link) {
                err = -ENOMEM;
                goto out_put_prog;
@@ -3752,6 +3738,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:
index 6a45c09fc0d87270ac759c752f3b57c6f2bd344f..5776d2b8e36eae41085f575899edea010c7724cf 100644 (file)
@@ -823,7 +823,7 @@ static int bpf_trampoline_add_prog(struct bpf_trampoline *tr,
                                   struct bpf_tramp_node *node,
                                   int cnt)
 {
-       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;
@@ -850,8 +850,8 @@ static int bpf_trampoline_add_prog(struct bpf_trampoline *tr,
        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]++;
@@ -862,13 +862,13 @@ static int bpf_trampoline_add_prog(struct bpf_trampoline *tr,
 static void bpf_trampoline_remove_prog(struct bpf_trampoline *tr,
                                       struct bpf_tramp_node *node)
 {
-       struct bpf_fsession_link *fslink;
+       struct bpf_tracing_link *tr_link;
        enum bpf_tramp_prog_type kind;
 
        kind = bpf_attach_type_to_tramp(node->link->prog);
        if (kind == BPF_TRAMP_FSESSION) {
-               fslink = container_of(node, struct bpf_fsession_link, link.link.node);
-               hlist_del_init(&fslink->fexit.node.tramp_hlist);
+               tr_link = container_of(node, struct bpf_tracing_link, link.node);
+               hlist_del_init(&tr_link->fexit.tramp_hlist);
                tr->progs_cnt[BPF_TRAMP_FEXIT]--;
                kind = BPF_TRAMP_FENTRY;
        }