Logo

Linux 内核

6.13.0-rc6

快速搜索

目录

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

本页

  • 显示源文件

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

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

  • 调用恢复过程

  • 运行诊断

  • 对象转储

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 提供支持 | 页面源文件