Logo

Linux 内核

6.16.0-rc4

快速搜索

目录

  • 开发过程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发过程文档
  • 核心 API
  • 驱动程序 API
  • 子系统
    • 核心子系统
    • 人机接口
    • 网络接口
      • 网络
      • NetLabel
      • InfiniBand
      • ISDN
      • MHI
    • 存储接口
    • 其他子系统
  • 锁
  • 许可规则
  • 编写文档
  • 开发工具
  • 测试指南
  • Hacking 指南
  • 跟踪
  • 故障注入
  • 热补丁
  • Rust
  • 管理
  • 构建系统
  • 报告问题
  • 用户空间工具
  • 用户空间 API
  • 固件
  • 固件和设备树
  • CPU 架构
  • 未分类文档
  • 翻译

本页

  • 显示源

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 访问/更改每个报告器的参数和驱动程序特定的回调函数,例如每种错误类型(每个健康报告器):

  • 配置报告器的通用参数(例如:禁用/启用自动恢复)

  • 调用恢复程序

  • 运行诊断

  • 对象转储

devlink 健康接口列表¶

名称

描述

DEVLINK_CMD_HEALTH_REPORTER_GET

按 DEV 和报告器检索状态和配置信息。

DEVLINK_CMD_HEALTH_REPORTER_SET

允许设置与报告器相关的配置。

DEVLINK_CMD_HEALTH_REPORTER_RECOVER

触发报告器的恢复程序。

DEVLINK_CMD_HEALTH_REPORTER_TEST

在报告器上触发一个假健康事件。测试事件在恢复流程方面的效果应与真实事件的效果紧密一致。

DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE

检索与报告器相关的当前设备状态。

DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET

检索上次存储的转储。Devlink 健康机制只保存一个转储。如果 devlink 尚未为此报告器存储转储,则 devlink 会生成一个新的转储。转储输出由报告器定义。

DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR

清除指定报告器最后保存的转储文件。

下图提供了 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 |                          |
|        +---------------------------->                          |
+--------+                            +--------------------------+
© 内核开发社区。 | 由 Sphinx 5.3.0 & Alabaster 0.7.16 提供支持 | 页面源