概要
本文是一个简单的信息记录。记录的是当服务器网卡的光模块插入后内核的日志打印。通过这种日志打印,可以在定位分析问题的时候,知道进行过一次模块插拔。
日志
截图版:
文字版:
bash
[32704.121294] mlx5_core 0000:01:00.0: Port module event: module 0, Cable plugged
[32707.399693] mlx5_core 0000:01:00.1: Port module event: module 1, Cable plugged
[32710.060490] mlx5_core 0000:01:00.0 enp1s0f0: Link up
[32710.060509] IPv6: ADDRCONF(NETDEV_CHANGE): enp1s0f0: link becomes ready
[32710.060809] mlx5_core 0000:01:00.1 enp1s0f1: Link up
[32710.061629] IPv6: ADDRCONF(NETDEV_CHANGE): enp1s0f1: link becomes ready
简要信息:
- 光模块插拔处理是在mlx5_core中出现的
- 在打印的信息中有module x表示第几个port
- 成功后会打印Link up。
- 插拔后会通知IPv6,并且显示link becomes ready
- 插拔后驱动会产生事件触发到对应模块比如IPv6 比如bond
代码

收到MLX5_EVENT_TYPE_PORT_MODULE_EVENT的事件。
触发机制:
事件注册的地方:
可看到是注册到eq上面的mlx5_eq_notifier_register
最后会放到eq的table表里面
初始化的时候会将这个eq与中断绑定:
然后创建3种eq:
这个setup_async_eq比较深,最终会下发cmd到网卡NIC上,下发方式是通过create_eq_in
的方式 用MLX5_SET(create_eq_in, in, opcode, MLX5_CMD_OP_CREATE_EQ);
于是当网卡NIC上有事件发生会通过eq上报。更多参考:Mellanox OFED驱动中eq的event与中断关系?通过什么机制调用不同event处理?注册的2种形式?
综述
本文记录往下插拔的关键日志以及通知机制,可以看到是网卡固件通过中断,在msi中断中用eq上报事件,并通过内核的notifier block机制通知到注册回调函数。最终在port_module的回调函数中(属于mlx5_core模块)进行打印,从而看到了上面的日志。
另外就是看到Cable plue就说明有一次插拔。这里的插拔不一定是网卡插拔,可能是光模块异常,可能是交换机异常。但是抓住本质和网卡机制,对于分析此类问题比较方便。