队列模型与管理机制 - 第102页
深入分析 NVM Express® Base Specification, revision 2.0b — 传输要求与队列数据结构
传输要求
在 NVM Express over Fabrics 的实现中,所有支持该协议的传输层都必须遵循以下要求:
- 传输错误检测与报告:
- 错误检测:NVMe传输层可以支持错误检测,并将错误报告给NVMe层。传输错误如果导致消息丢失或数据丢失,并且该错误无法通过低级传输层进行重传或恢复时,应采取以下措施:
- 删除发生错误的特定I/O队列,并关闭关联的NVMe传输连接。
- 终止NVMe传输连接并结束主机与控制器之间的关联。
-
错误记录:传输层可能会在错误信息日志中记录特定的传输错误。
-
命令胶囊(Command Capsules)的可靠交付:
-
传输层必须确保命令胶囊能够可靠地在主机和NVM子系统(及其控制器)之间传输。命令胶囊的交付顺序不要求严格按照顺序进行,除了在以下特定情况下:
- 融合操作命令(Fused Operations):对于作为融合操作一部分的I/O命令,传输层必须确保:
- 两个命令胶囊(属于融合操作的两个命令)按顺序交付。
- 在交付完两个融合操作命令胶囊之前,不能交付同一提交队列中的其他命令胶囊。
-
响应胶囊(Response Capsules)的可靠交付:
- 传输层还必须确保从NVM子系统到主机的响应胶囊能够可靠传输,并且这些响应胶囊必须按顺序交付,特别是包含提交队列头指针(SQHD)的响应胶囊,包括所有的连接响应胶囊和断开连接响应胶囊。
队列数据结构
在 NVMe 中,队列是用于管理命令和响应的核心结构之一,特别是 提交队列(Submission Queue)。每个提交队列条目使用 64 字节 来存储相关数据。具体来说,提交队列条目包括以下字段:
- 命令字0(Command Dword 0):
-
这是每个命令的第一个数据字,用于标识命令和包含一些通用字段。
-
命令标识符(CID):
- CID 字段指定该命令的唯一标识符,它是通过将提交队列标识符与命令标识符结合使用来确保唯一性。
-
特别注意:FFFFh值不应该用于命令标识符,因为该值被错误信息日志页用于表示没有特定命令关联的错误。
-
命名空间标识符(NSID)、元数据指针(Metadata Pointer)、PRP条目(PRP Entry) 等字段:
- 这些字段在所有 管理员命令 和 I/O命令 中具有共通定义,但并非所有命令都使用每一个字段。例如,PRP条目和元数据SGL段指针并不被所有命令使用。
总结:
- 传输层:支持 NVMe over Fabrics 的传输层需要处理错误检测、可靠的命令和响应交付,并确保融合操作命令的顺序交付。
- 提交队列条目:提交队列条目有64字节,其中包括命令标识符、命名空间标识符和其他用于命令执行的字段。每个命令都有唯一的命令标识符,确保队列中命令的正确处理。