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
|
* - if tgt_prog == NULL when this function was called using the old
|
||||||
* raw_tracepoint_open API, and we need a target from prog->aux
|
* raw_tracepoint_open API, and we need a target from prog->aux
|
||||||
*
|
*
|
||||||
* The combination of no saved target in prog->aux, and no target
|
* - if prog->aux->dst_trampoline and tgt_prog is NULL, the program
|
||||||
* specified on load is illegal, and we reject that here.
|
* was detached and is going for re-attachment.
|
||||||
*/
|
*/
|
||||||
if (!prog->aux->dst_trampoline && !tgt_prog) {
|
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;
|
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 ||
|
if (!prog->aux->dst_trampoline ||
|
||||||
(key && key != prog->aux->dst_trampoline->key)) {
|
(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]++;
|
tr->progs_cnt[kind]++;
|
||||||
err = bpf_trampoline_update(tr);
|
err = bpf_trampoline_update(tr);
|
||||||
if (err) {
|
if (err) {
|
||||||
hlist_del(&prog->aux->tramp_hlist);
|
hlist_del_init(&prog->aux->tramp_hlist);
|
||||||
tr->progs_cnt[kind]--;
|
tr->progs_cnt[kind]--;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
@ -467,7 +467,7 @@ int bpf_trampoline_unlink_prog(struct bpf_prog *prog, struct bpf_trampoline *tr)
|
||||||
tr->extension_prog = NULL;
|
tr->extension_prog = NULL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
hlist_del(&prog->aux->tramp_hlist);
|
hlist_del_init(&prog->aux->tramp_hlist);
|
||||||
tr->progs_cnt[kind]--;
|
tr->progs_cnt[kind]--;
|
||||||
err = bpf_trampoline_update(tr);
|
err = bpf_trampoline_update(tr);
|
||||||
out:
|
out:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче