管理命令集 - 📌 一、异步事件上报机制核心逻辑 (第159页)
我们继续深入学习并用中文解析 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 的命令结构或用例。你想继续看哪一部分呢?