错误处理与诊断 - 第425页
我们继续深入解析 NVMe 2.0b 规范第 8.19 节 Reservation(预留)机制的尾声部分,包括:
- 🚦Reservation 场景下的命令处理行为(Figure 473 分析)
- 🔔Reservation Notification(预留事件通知)机制
✅ 一、Figure 473:Reservation 下命令行为分析
该表明确了在预留生效情况下,各种命令被不同主机发起时的行为结果(Allowed / Conflict)。
📌 表格说明
| 缩写 | 意义 |
|---|---|
| A | Allowed(允许,控制器正常处理该命令) |
| C | Conflict(冲突,控制器以 Reservation Conflict 状态码终止命令) |
🧩 示例分析
我们以常见命令行为例进行说明:
| Command | 非注册者发出 | 注册者发出 | 说明 |
|---|---|---|---|
| Read 命令 | A(部分类型)或 C | A | - Read 操作在 Write Exclusive 类预留下通常是允许的 - Exclusive Access 类型则不允许非注册者读 |
| Write 命令 | C(全部类型) | A(部分类型)或 C | - 非注册者永远不能写 - 注册者是否能写,取决于是否为 Reservation Holder(持有者)或是 All Registrants |
| Reservation 命令 | C / A | C / A | - 如 Preempt、Release 等命令,非注册者不可随意操作 |
| 其他 Admin 命令(如 Flush, Format, Attach 等) | A | A | - 不涉及命名空间内容访问的命令通常被允许执行 |
📍特例命令说明:
- Reservation Acquire - Acquire / Preempt / Release
这些命令的行为依赖于 是否为当前持有者,以及Ignore Existing Key标志等(详见第 7 章)。
🔔 二、Reservation Notification(预留通知)
🔔 支持的三类通知事件
| 通知类型 | 含义 |
|---|---|
| Registration Preempted | 注册记录被其他主机抢占(或预留失效) |
| Reservation Released | Reservation 被主动释放 |
| Reservation Preempted | Reservation 被另一个主机覆盖(新的持有者) |
这些事件用于帮助主机感知 Reservation 状态的变更。
📋 Reservation Notification Log Page(第 5.16.1.24 节)
当出现上述通知事件时,控制器会生成 Reservation Notification Log Page,其中记录:
- 通知类型(如 Preempted, Released)
- Namespace ID
- 被影响的 Host ID 等
⚙️ Reservation Notification Mask(5.27.1.26 节)
主机可使用 Set Features 命令配置:
- 对哪些通知类型生效
- 是否生成对应 Log Page
- 对哪些 Namespace ID 生效
这样可以 降低不必要的通知开销。
📡 异步通知机制
主机可以使用:
Asynchronous Event Request命令(详见第 5.2 节)
注册通知,当 Reservation Notification Log Page 可用时,控制器通过异步事件机制告知主机,从而实现主动事件感知。
✅ 总结回顾
| 项目 | 说明 |
|---|---|
| Command 行为 | 在预留状态下,不同主机的命令访问权限可控 |
| 行为关键因素 | 是否注册、是否为 Reservation Holder、预留类型 |
| Reservation Notification | 提供注册抢占、释放、被覆盖等三类事件通报 |
| Log Page | 控制器通过 Log Page 记录 Reservation 通知 |
| 异步通知 | 主机可通过异步事件命令接收这些 Log Page 生成通知 |
| Mask 控制 | 主机可以屏蔽某些 Reservation 通知类型 |
如果你希望继续解析 第 8.20 节 Rebuild Assist、第 8.21 节 Simple Copy 或其他你关心的命令集、机制结构,可以随时告诉我。
你接下来想继续看哪一节?或者我可以帮你整理完整的 Reservation 状态机图?