管理命令集 - 📌 一、异步事件上报机制核心逻辑 (第159页)
NVME2.0协议解读 1 min read

管理命令集 - 📌 一、异步事件上报机制核心逻辑 (第159页)

Blog Author

我们继续深入学习并用中文解析 NVMe 2.0b 规范第 148 页 关于 Asynchronous Event Request(AER,异步事件请求)命令的机制,重点理解其事件类型、清除方式、重复上报控制、以及完成机制


📌 一、异步事件上报机制核心逻辑

控制器上报异步事件的方式是 完成一个 Asynchronous Event Request 命令。即控制器接收到该命令后并不会立即完成,而是 等待一个需要通知主机的事件发生 时才完成它。

事件触发后,必须满足以下条件才能发出 CQE(Completion Queue Entry)

控制器 必须能成功返回用于清除该事件的日志页(Log Page),否则即使事件发生了,也不会立即报告给主机。


📚 二、定义的事件类型(Event Types)

标准中定义了 6 类事件类型(详见 Figure 144 ~ 147),下面我们来逐条中文解析:


### 🅰️ a) Error event —— 错误事件

一般性错误(与具体命令无关

  • 清除方法:
    主机通过 Get Log Page 命令读取 Error Information Log(错误信息日志),并将 Retain Asynchronous Event 位设为 0,表示读取该日志页即为“清除事件”。

### 🅱️ b) SMART / Health Status event —— 健康状态事件

表示存储设备 SMART 状态或健康状态发生变化

  • 清除方法:
    主机读取 SMART / Health Information Log(健康信息日志)Retain AER 设为 0,即可清除事件。

  • 触发条件可配置:
    使用 Set Features 命令设置 Asynchronous Event Configuration(AER 配置) 来决定哪些健康事件会触发 AER,例如温度过高、剩余寿命低等。


### 🅲️ c) Notice event —— 通知类事件

一般通知类事件,如命名空间变化、电源状态变化等

  • 清除方法:
    主机根据事件种类读取相应的 Log Page(详见 Figure 146)。

  • 触发条件也可配置:
    同样使用 Set Features 设置 AER 配置。


### 🅳️ d) I/O Command Specific Status events —— 特定 I/O 命令状态事件

与某些特定 I/O 命令相关的状态事件(详见 Figure 147)


### 🅴️ e) Immediate events —— 即时事件

这些事件只会在事件发生时主机已有 AER 命令处于挂起状态时被报告,否则直接丢弃,也无对应日志页可查

  • 例如:
  • 正常的 NVM 子系统关机事件(Normal NVM Subsystem Shutdown Event)

### 🅵️ f) Vendor Specific events —— 厂商自定义事件

由厂商定义的事件及其对应日志页

  • 清除方法:
    读取厂商指定的日志页,Retain AER = 0

📌 三、Sanitize 异步事件(特例说明)

如果控制器支持 Sanitize Config 功能(数据擦除配置),它必须支持一个特定异步事件:

  • Sanitize Operation Completed With Unexpected Deallocation
  • 意味着擦除操作完成但伴随了预期外的资源释放。

🔁 四、事件去重与排队机制(防止重复上报)

🔔 事件上报的条件总结:

情况 控制器行为
事件已发生、但日志页不可读取 不发出 CQE(不报告事件)
相同类型事件发生多次,响应一致 可合并为一次报告
不同类型事件或响应不同 控制器会保留事件队列,依次用 AER 响应

❗避免重复事件的方法:

  • 主机应在收到异步事件后,更新事件触发阈值或屏蔽该事件类型(通过配置),以防止反复上报。

⚠️ 如果事件发生时没有 AER 命令挂起:

  • 控制器应该“保留事件信息”,并在 下次收到 AER 命令时立即用该事件响应
  • 但如果在此期间主机已读取了日志页(即事件被清除),或发生断电,那这个事件就不会再被报告

✅ 五、命令完成机制总结

  • 如果事件触发条件满足,控制器将发出 CQE 到 Admin Completion Queue;
  • Dword 0 中包含 Asynchronous Event Type 字段
  • 命令特定的状态值定义在 Figure 142(可以进一步查看详细状态码)。

🧠 学习小结:

内容 要点
事件类型 6 类:错误、健康、通知、命令特定、即时、厂商自定义
清除事件方法 一般通过读取对应 Log Page,Retain AER = 0
去重机制 相同事件合并,不同事件排队
无 AER 命令时发生事件 控制器会“记住”事件,但有可能因清除或断电丢失
即时事件 无日志页,必须有挂起的 AER 命令才会报告

如果你有兴趣,我可以进一步带你对比 NVMe Base Spec 与 NVMe-MI 在 AER 上报机制的差异,也可以展示具体 Get Log Page 的命令结构或用例。你想继续看哪一部分呢?