mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 07:50:04 +00:00
bpf: Use rcu_trace_implies_rcu_gp() for program array freeing
To support both sleepable and normal uprobe bpf program, the freeing of trace program array chains a RCU-tasks-trace grace period and a normal RCU grace period one after the other. With the introduction of rcu_trace_implies_rcu_gp(), __bpf_prog_array_free_sleepable_cb() can check whether or not a normal RCU grace period has also passed after a RCU-tasks-trace grace period has passed. If it is true, it is safe to invoke kfree() directly. Signed-off-by: Hou Tao <houtao1@huawei.com> Link: https://lore.kernel.org/r/20221014113946.965131-5-houtao@huaweicloud.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
d39d1445d3
commit
4835f9ee98
@ -2251,8 +2251,14 @@ static void __bpf_prog_array_free_sleepable_cb(struct rcu_head *rcu)
|
||||
{
|
||||
struct bpf_prog_array *progs;
|
||||
|
||||
/* If RCU Tasks Trace grace period implies RCU grace period, there is
|
||||
* no need to call kfree_rcu(), just call kfree() directly.
|
||||
*/
|
||||
progs = container_of(rcu, struct bpf_prog_array, rcu);
|
||||
kfree_rcu(progs, rcu);
|
||||
if (rcu_trace_implies_rcu_gp())
|
||||
kfree(progs);
|
||||
else
|
||||
kfree_rcu(progs, rcu);
|
||||
}
|
||||
|
||||
void bpf_prog_array_free_sleepable(struct bpf_prog_array *progs)
|
||||
|
Loading…
x
Reference in New Issue
Block a user