bpf: Allow trampoline re-attach for tracing and lsm programs
Currently we don't allow re-attaching of trampolines. Once it's detached, it can't be re-attach even when the program is still loaded. Adding the possibility to re-attach the loaded tracing and lsm programs. Fixing missing unlock with proper cleanup goto jump reported by Julia. Reported-by: kernel test robot <lkp@intel.com> Reported-by: Julia Lawall <julia.lawall@lip6.fr> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> Acked-by: Andrii Nakryiko <andrii@kernel.org> Acked-by: KP Singh <kpsingh@kernel.org> Link: https://lore.kernel.org/bpf/20210414195147.1624932-2-jolsa@kernel.org
This commit is contained in:
Родитель
0ea1041bfa
Коммит
f3a9507554
|
@ -2650,13 +2650,24 @@ static int bpf_tracing_prog_attach(struct bpf_prog *prog,
|
|||
* - if tgt_prog == NULL when this function was called using the old
|
||||
* raw_tracepoint_open API, and we need a target from prog->aux
|
||||
*
|
||||
* The combination of no saved target in prog->aux, and no target
|
||||
* specified on load is illegal, and we reject that here.
|
||||
* - if prog->aux->dst_trampoline and tgt_prog is NULL, the program
|
||||
* was detached and is going for re-attachment.
|
||||
*/
|
||||
if (!prog->aux->dst_trampoline && !tgt_prog) {
|
||||
err = -ENOENT;
|
||||
/*
|
||||
* Allow re-attach for TRACING and LSM programs. If it's
|
||||
* currently linked, bpf_trampoline_link_prog will fail.
|
||||
* EXT programs need to specify tgt_prog_fd, so they
|
||||
* re-attach in separate code path.
|
||||
*/
|
||||
if (prog->type != BPF_PROG_TYPE_TRACING &&
|
||||
prog->type != BPF_PROG_TYPE_LSM) {
|
||||
err = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
btf_id = prog->aux->attach_btf_id;
|
||||
key = bpf_trampoline_compute_key(NULL, prog->aux->attach_btf, btf_id);
|
||||
}
|
||||
|
||||
if (!prog->aux->dst_trampoline ||
|
||||
(key && key != prog->aux->dst_trampoline->key)) {
|
||||
|
|
|
@ -444,7 +444,7 @@ int bpf_trampoline_link_prog(struct bpf_prog *prog, struct bpf_trampoline *tr)
|
|||
tr->progs_cnt[kind]++;
|
||||
err = bpf_trampoline_update(tr);
|
||||
if (err) {
|
||||
hlist_del(&prog->aux->tramp_hlist);
|
||||
hlist_del_init(&prog->aux->tramp_hlist);
|
||||
tr->progs_cnt[kind]--;
|
||||
}
|
||||
out:
|
||||
|
@ -467,7 +467,7 @@ int bpf_trampoline_unlink_prog(struct bpf_prog *prog, struct bpf_trampoline *tr)
|
|||
tr->extension_prog = NULL;
|
||||
goto out;
|
||||
}
|
||||
hlist_del(&prog->aux->tramp_hlist);
|
||||
hlist_del_init(&prog->aux->tramp_hlist);
|
||||
tr->progs_cnt[kind]--;
|
||||
err = bpf_trampoline_update(tr);
|
||||
out:
|
||||
|
|
Загрузка…
Ссылка в новой задаче