diff options
author | Hou Tao <houtao1@huawei.com> | 2023-08-16 12:59:57 +0800 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2023-08-21 15:21:16 -0700 |
commit | 8f8500a247c91e0d263283879166fffbb3329584 (patch) | |
tree | ca366a0d7c63cfb03330b1080e26ea4696807486 /arch/mips | |
parent | 0a55264cf966fb95ebf9d03d9f81fa992f069312 (diff) | |
download | linux-stable-8f8500a247c91e0d263283879166fffbb3329584.tar.gz linux-stable-8f8500a247c91e0d263283879166fffbb3329584.tar.bz2 linux-stable-8f8500a247c91e0d263283879166fffbb3329584.zip |
bpf, cpumap: Use queue_rcu_work() to remove unnecessary rcu_barrier()
As for now __cpu_map_entry_replace() uses call_rcu() to wait for the
inflight xdp program to exit the RCU read critical section, and then
launch kworker cpu_map_kthread_stop() to call kthread_stop() to flush
all pending xdp frames or skbs.
But it is unnecessary to use rcu_barrier() in cpu_map_kthread_stop() to
wait for the completion of __cpu_map_entry_free(), because rcu_barrier()
will wait for all pending RCU callbacks and cpu_map_kthread_stop() only
needs to wait for the completion of a specific __cpu_map_entry_free().
So use queue_rcu_work() to replace call_rcu(), schedule_work() and
rcu_barrier(). queue_rcu_work() will queue a __cpu_map_entry_free()
kworker after a RCU grace period. Because __cpu_map_entry_free() is
running in a kworker context, so it is OK to do all of these freeing
procedures include kthread_stop() in it.
After the update, there is no need to do reference-counting for
bpf_cpu_map_entry, because bpf_cpu_map_entry is freed directly in
__cpu_map_entry_free(), so just remove it.
Signed-off-by: Hou Tao <houtao1@huawei.com>
Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
Link: https://lore.kernel.org/r/20230816045959.358059-2-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'arch/mips')
0 files changed, 0 insertions, 0 deletions