【微知】Mellanox OFED驱动中eq的event与中断关系?通过什么机制调用不同event处理?注册的2种形式?(mlx5_eq_notifier_register、MLX5_NB_INIT)

背景

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种形式:

  1. 通过各个分散代码中使用MLX5_NB_INIT定义nb然后挂在eq的nh,然后注册
  2. 通过events_nbs_ref结构化定义,然后统一注册,注册时间实在驱动probe期间
分散各处动态注册
驱动加载阶段 统一
两种注册notifier的形式
MLX5_NB_INIT
mlx5_eq_notifier_register
events_nbs_ref

两种形式

形式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;                  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值