我在Linux内核版本3.13.0上使用mellanox Infiniband card MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE]
和mlnx-ofed-kernel-3.1
。
当卡连接到另一个卡并进行配置时(ibstat表示两个卡在infiniband链路层都处于活动状态),我试验卡每9秒发送8个中断,包括4对事件类型MLX4_EVENT_TYPE_COMP
和MLX4_EVENT_TYPE_CMD
。
我还注意到,如果我修改函数mlx4_interrupt代码(这是mlnx-ofed-kernel-3.1中的中断处理程序)以避免它处理那两个中断事件,则完成队列是直接导致的,直接导致进一步的infiniband卡上的数据传输失败。
我的问题是这些中断事件和MLX4_EVENT_TYPE_COMP
和MLX4_EVENT_TYPE_CMD
的目的是什么?为什么它们必须保持队列对可用?
以下是drivers / net / ethernet / mellanox / mlx4 / eq.c中每个中断事件调用的代码
MLX4_EVENT_TYPE_COMP
:
cqn = be32_to_cpu(eqe->event.comp.cqn) & 0xffffff;
mlx4_cq_completion(dev, cqn);
MLX4_EVENT_TYPE_CMD
:
mlx4_cmd_event(dev, be16_to_cpu(eqe->event.cmd.token), eqe->event.cmd.status, be64_to_cpu(eqe->event.cmd.out_param));