Devlink 健康¶
背景¶
devlink
健康机制旨在实现实时警报,以便了解 PCI 设备何时出现问题。
提供警报调试信息。
自愈。
如果问题需要供应商支持,提供一种收集所有所需调试信息的方法。
概述¶
主要思想是统一和集中驱动程序健康报告到通用的 devlink
实例中,并允许用户设置健康报告和恢复过程的不同属性。
devlink
健康报告器:设备驱动程序为每种错误/健康类型创建一个“健康报告器”。错误/健康类型可以是已知/通用的(例如 PCI 错误、固件错误、收发错误)或未知(驱动程序特定的)。对于每个注册的健康报告器,驱动程序可以异步地发出错误/健康报告。所有健康报告处理都由 devlink
完成。设备驱动程序可以为每个“健康报告器”提供特定的回调函数,例如:
恢复程序
诊断程序
对象转储程序
开箱即用初始参数
驱动程序的不同部分可以注册不同类型的健康报告器,并带有不同的处理程序。
动作¶
一旦报告了错误,devlink 健康机制将执行以下操作:
日志将被发送到内核跟踪事件缓冲区
报告器实例的健康状态和统计数据正在更新
正在进行对象转储并保存在报告器实例中(只要设置了自动转储并且没有其他已存储的转储)
正在尝试自动恢复。取决于:
自动恢复配置
宽限期与上次恢复以来的时间
Devlink 格式化消息¶
为了处理 devlink 健康诊断和健康转储请求,devlink 创建了一个格式化消息结构 devlink_fmsg
并将其发送到驱动程序的 callback 函数,以便使用 devlink fmsg API 填充数据。
Devlink fmsg 是一种在驱动程序和 devlink 之间传递描述符的机制,采用类似 json 的格式。该 API 允许驱动程序添加嵌套属性,例如对象、对象对和值数组,以及名称和值等属性。
驱动程序应使用此 API 以一种格式填充 fmsg 上下文,该格式稍后将由 devlink 转换为 netlink 消息。当需要使用 SKB 将数据发送到 netlink 层时,它会将数据分段到不同的 SKB 之间。为了执行这种分段,它使用虚拟嵌套属性,以避免实际的嵌套使用,因为实际嵌套不能在不同的 SKB 之间分割。
用户界面¶
用户可以通过 devlink
访问/更改每个报告器的参数和驱动程序特定的回调函数,例如每种错误类型(每个健康报告器):
配置报告器的通用参数(例如:禁用/启用自动恢复)
调用恢复程序
运行诊断
对象转储
名称 |
描述 |
|
按 DEV 和报告器检索状态和配置信息。 |
|
允许设置与报告器相关的配置。 |
|
触发报告器的恢复程序。 |
|
在报告器上触发一个假健康事件。测试事件在恢复流程方面的效果应与真实事件的效果紧密一致。 |
|
检索与报告器相关的当前设备状态。 |
|
检索上次存储的转储。Devlink 健康机制只保存一个转储。如果 devlink 尚未为此报告器存储转储,则 devlink 会生成一个新的转储。转储输出由报告器定义。 |
|
清除指定报告器最后保存的转储文件。 |
下图提供了 devlink-health
的概览
netlink
+--------------------------+
| |
| + |
| | |
+--------------------------+
|request for ops
|(diagnose,
driver devlink |recover,
|dump)
+--------+ +--------------------------+
| | | reporter| |
| | | +---------v----------+ |
| | ops execution | | | |
| <----------------------------------+ | |
| | | | | |
| | | + ^------------------+ |
| | | | request for ops |
| | | | (recover, dump) |
| | | | |
| | | +-+------------------+ |
| | health report | | health handler | |
| +-------------------------------> | |
| | | +--------------------+ |
| | health reporter create | |
| +----------------------------> |
+--------+ +--------------------------+