mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
bpf: put uprobe link's path and task in release callback
There is no need to delay putting either path or task to deallocation step. It can be done right after bpf_uprobe_unregister. Between release and dealloc, there could be still some running BPF programs, but they don't access either task or path, only data in link->uprobes, so it is safe to do. On the other hand, doing path_put() in dealloc callback makes this dealloc sleepable because path_put() itself might sleep. Which is problematic due to the need to call uprobe's dealloc through call_rcu(), which is what is done in the next bug fix patch. So solve the problem by releasing these resources early. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/r/20240328052426.3042617-1-andrii@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
037965402a
commit
e9c856cabe
@ -3157,6 +3157,9 @@ static void bpf_uprobe_multi_link_release(struct bpf_link *link)
|
|||||||
|
|
||||||
umulti_link = container_of(link, struct bpf_uprobe_multi_link, link);
|
umulti_link = container_of(link, struct bpf_uprobe_multi_link, link);
|
||||||
bpf_uprobe_unregister(&umulti_link->path, umulti_link->uprobes, umulti_link->cnt);
|
bpf_uprobe_unregister(&umulti_link->path, umulti_link->uprobes, umulti_link->cnt);
|
||||||
|
if (umulti_link->task)
|
||||||
|
put_task_struct(umulti_link->task);
|
||||||
|
path_put(&umulti_link->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bpf_uprobe_multi_link_dealloc(struct bpf_link *link)
|
static void bpf_uprobe_multi_link_dealloc(struct bpf_link *link)
|
||||||
@ -3164,9 +3167,6 @@ static void bpf_uprobe_multi_link_dealloc(struct bpf_link *link)
|
|||||||
struct bpf_uprobe_multi_link *umulti_link;
|
struct bpf_uprobe_multi_link *umulti_link;
|
||||||
|
|
||||||
umulti_link = container_of(link, struct bpf_uprobe_multi_link, link);
|
umulti_link = container_of(link, struct bpf_uprobe_multi_link, link);
|
||||||
if (umulti_link->task)
|
|
||||||
put_task_struct(umulti_link->task);
|
|
||||||
path_put(&umulti_link->path);
|
|
||||||
kvfree(umulti_link->uprobes);
|
kvfree(umulti_link->uprobes);
|
||||||
kfree(umulti_link);
|
kfree(umulti_link);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user