[RFC PATCH bpf-next 01/17] bpf: Link shimlink directly in trampoline

Jiri Olsa
2022-08-08T14:06:48Z

We are going to get rid of struct bpf_tramp_link in following
changes and cgroup_shim_find logic does not fit to that.

We can store the link directly in the trampoline and omit the
cgroup_shim_find searching logic.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
include/linux/bpf.h | 3 +++
kernel/bpf/trampoline.c | 23 +++--------------------
2 files changed, 6 insertions(+), 20 deletions(-)

diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 20c26aed7896..ed2a921094bc 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -841,6 +841,8 @@ struct bpf_tramp_image {
};
};

+struct bpf_shim_tramp_link;
+
struct bpf_trampoline {
/* hlist for trampoline_table */
struct hlist_node hlist;
@@ -868,6 +870,7 @@ struct bpf_trampoline {
struct bpf_tramp_image *cur_image;
u64 selector;
struct module *mod;
+ struct bpf_shim_tramp_link *shim_link;
};

struct bpf_attach_target_info {
diff --git a/kernel/bpf/trampoline.c b/kernel/bpf/trampoline.c
index ff87e38af8a7..7a65d33cda60 100644
--- a/kernel/bpf/trampoline.c
+++ b/kernel/bpf/trampoline.c
@@ -689,24 +689,6 @@ static struct bpf_shim_tramp_link *cgroup_shim_alloc(const struct bpf_prog *prog
return shim_link;
}

-static struct bpf_shim_tramp_link *cgroup_shim_find(struct bpf_trampoline *tr,
- bpf_func_t bpf_func)
-{
- struct bpf_tramp_link *link;
- int kind;
-
- for (kind = 0; kind < BPF_TRAMP_MAX; kind++) {
- hlist_for_each_entry(link, &tr->progs_hlist[kind], tramp_hlist) {
- struct bpf_prog *p = link->link.prog;
-
- if (p->bpf_func == bpf_func)
- return container_of(link, struct bpf_shim_tramp_link, link);
- }
- }
-
- return NULL;
-}
-
int bpf_trampoline_link_cgroup_shim(struct bpf_prog *prog,
int cgroup_atype)
{
@@ -733,7 +715,7 @@ int bpf_trampoline_link_cgroup_shim(struct bpf_prog *prog,

mutex_lock(&tr->mutex);

- shim_link = cgroup_shim_find(tr, bpf_func);
+ shim_link = tr->shim_link;
if (shim_link) {
/* Reusing existing shim attached by the other program. */
bpf_link_inc(&shim_link->link.link);
@@ -756,6 +738,7 @@ int bpf_trampoline_link_cgroup_shim(struct bpf_prog *prog,
goto err;

shim_link->trampoline = tr;
+ tr->shim_link = shim_link;
/* note, we're still holding tr refcnt from above */

mutex_unlock(&tr->mutex);
@@ -789,7 +772,7 @@ void bpf_trampoline_unlink_cgroup_shim(struct bpf_prog *prog)
return;

mutex_lock(&tr->mutex);
- shim_link = cgroup_shim_find(tr, bpf_func);
+ shim_link = tr->shim_link;
mutex_unlock(&tr->mutex);

if (shim_link)
--
2.37.1