文章目录
背景
Mellanox OFED驱动通过event queue获取来自网卡产生的事件,EQ又是通过绑定到PCIe的MSIX的中断中。从而网卡通过中断,然后通过eq,最后通过与eq绑定的事件来触发驱动进行一些操作。触发的机制是使用了linux的notifier block机制。初始化的时候进行注册,调用的时候使用。
本文详细介绍notifer的2种注册形式以及eq、中断、event、notifer等相互关系和主要数据结构
关键信息
两种注册notifier的形式
在OFED驱动中都是通过mlx5_eq_notifier_register来注册nb到对应eqt的nh中,主要通过2种形式:
- 通过各个分散代码中使用MLX5_NB_INIT定义nb然后挂在eq的nh,然后注册
- 通过events_nbs_ref结构化定义,然后统一注册,注册时间实在驱动probe期间
两种形式
形式1:通过MLX5_NB_INIT定义
注册的一些事件和处理函数以及对应的notifier block
下面这些事件和处理函数通过MLX5_NB_INIT定义一个notifier block,并且用mlx5_eq_notifier_register将这个nb注册到eq table中,会被挂在eq table的notifier header中,每个nh可能挂载多个nb(notifier block)
举一个例子: 先定义一个nb,然后把nb通过mlx5_eq_notifier_register,挂到对应的事件上去,这里对应列表中的第一个 MLX5_EVENT_TYPE_CMD, 代码中MLX5_NB_INIT会扩展CMD
void mlx5_cmd_use_events(struct mlx5_core_dev *dev)
{
MLX5_NB_INIT(&dev->cmd.nb, cmd_comp_notifier, CMD);
mlx5_eq_notifier_register(dev, &dev->cmd.nb);
...
}
#define MLX5_NB_INIT(name, handler, event) do {
\
(name)->nb.notifier_call = handler;

最低0.47元/天 解锁文章
9754

被折叠的 条评论
为什么被折叠?



