Devlink 健康¶
背景¶
devlink
健康机制的目标是实时警报,以便了解 PCI 设备何时发生问题。
提供警报调试信息。
自我修复。
如果问题需要供应商支持,则提供一种收集所有所需调试信息的方法。
概述¶
主要思想是将驱动程序健康报告统一并集中在通用 devlink
实例中,并允许用户设置健康报告和恢复过程的不同属性。
devlink
健康报告器:设备驱动程序为每个错误/健康类型创建一个“健康报告器”。错误/健康类型可以是已知的/通用的(例如,PCI 错误、固件错误、rx/tx 错误)或未知的(驱动程序特定的)。对于每个注册的健康报告器,驱动程序可以异步发出错误/健康报告。所有健康报告处理均由 devlink
完成。设备驱动程序可以为每个“健康报告器”提供特定的回调,例如:
恢复过程
诊断过程
对象转储过程
开箱即用的初始参数
驱动程序的各个部分可以使用不同的处理程序注册不同类型的健康报告器。
操作¶
一旦报告了错误,devlink 健康将执行以下操作
日志将发送到内核跟踪事件缓冲区
报告器实例的健康状况和统计信息正在更新
正在获取对象转储并将其保存在报告器实例中(只要设置了自动转储并且没有其他已经存储的转储)
正在尝试自动恢复。取决于
自动恢复配置
自上次恢复以来经过的宽限期与时间
Devlink 格式化消息¶
为了处理 devlink 健康诊断和健康转储请求,devlink 创建了一个格式化的消息结构 devlink_fmsg
,并将其发送到驱动程序的回调,以便使用 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 | |
| +----------------------------> |
+--------+ +--------------------------+