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@xxxxxxxxxx> --- 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