• Hou Tao's avatar
    bpf, cpumap: Use queue_rcu_work() to remove unnecessary rcu_barrier() · 8f8500a2
    Hou Tao authored
    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: default avatarHou Tao <houtao1@huawei.com>
    Reviewed-by: default avatarToke Høiland-Jørgensen <toke@redhat.com>
    Link: https://lore.kernel.org/r/20230816045959.358059-2-houtao@huaweicloud.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    8f8500a2
cpumap.c 20.1 KB