首先mlx5_core驱动有一个单线程的workqueue,每一秒mlx5_fc_stats_work都会被调到,去fw里面查询flow对应的counter。然后放在struct mlx5_fc。这里面用到了单线程,单链表,所以mlx5_fc插入删除的时候并没有锁。当然也不是一个一个的查,而是批量的查。这个即使上百万的flow counter也不会消耗太长时间。
然后用tc去查询相应的flow的时候,下面的函数会被调到:
fl_dump
fl_hw_update_stats
tc_setup_cb_call
mlx5e_setup_tc_block_cb
mlx5e_stats_flower
tcf_exts_stats_update
for(nr_actions)
tcf_action_stats_update