队列模型与管理机制 - 第102页
NVME2.0协议解读 1 min read

队列模型与管理机制 - 第102页

Blog Author

深入分析 NVM Express® Base Specification, revision 2.0b — 传输要求与队列数据结构

传输要求

NVM Express over Fabrics 的实现中,所有支持该协议的传输层都必须遵循以下要求:

  1. 传输错误检测与报告
  2. 错误检测:NVMe传输层可以支持错误检测,并将错误报告给NVMe层。传输错误如果导致消息丢失或数据丢失,并且该错误无法通过低级传输层进行重传或恢复时,应采取以下措施:
    • 删除发生错误的特定I/O队列,并关闭关联的NVMe传输连接。
    • 终止NVMe传输连接并结束主机与控制器之间的关联。
  3. 错误记录:传输层可能会在错误信息日志中记录特定的传输错误。

  4. 命令胶囊(Command Capsules)的可靠交付

  5. 传输层必须确保命令胶囊能够可靠地在主机和NVM子系统(及其控制器)之间传输。命令胶囊的交付顺序不要求严格按照顺序进行,除了在以下特定情况下:

    • 融合操作命令(Fused Operations):对于作为融合操作一部分的I/O命令,传输层必须确保:
    • 两个命令胶囊(属于融合操作的两个命令)按顺序交付。
    • 在交付完两个融合操作命令胶囊之前,不能交付同一提交队列中的其他命令胶囊。
  6. 响应胶囊(Response Capsules)的可靠交付

  7. 传输层还必须确保从NVM子系统到主机的响应胶囊能够可靠传输,并且这些响应胶囊必须按顺序交付,特别是包含提交队列头指针(SQHD)的响应胶囊,包括所有的连接响应胶囊和断开连接响应胶囊。

队列数据结构

NVMe 中,队列是用于管理命令和响应的核心结构之一,特别是 提交队列(Submission Queue)。每个提交队列条目使用 64 字节 来存储相关数据。具体来说,提交队列条目包括以下字段:

  1. 命令字0(Command Dword 0)
  2. 这是每个命令的第一个数据字,用于标识命令和包含一些通用字段。

  3. 命令标识符(CID)

  4. CID 字段指定该命令的唯一标识符,它是通过将提交队列标识符与命令标识符结合使用来确保唯一性。
  5. 特别注意:FFFFh值不应该用于命令标识符,因为该值被错误信息日志页用于表示没有特定命令关联的错误。

  6. 命名空间标识符(NSID)元数据指针(Metadata Pointer)PRP条目(PRP Entry) 等字段:

  7. 这些字段在所有 管理员命令I/O命令 中具有共通定义,但并非所有命令都使用每一个字段。例如,PRP条目元数据SGL段指针并不被所有命令使用。

总结:

  • 传输层:支持 NVMe over Fabrics 的传输层需要处理错误检测、可靠的命令和响应交付,并确保融合操作命令的顺序交付。
  • 提交队列条目:提交队列条目有64字节,其中包括命令标识符、命名空间标识符和其他用于命令执行的字段。每个命令都有唯一的命令标识符,确保队列中命令的正确处理。