队列模型 - 📘 一、完成队列条目:DW2 结构(Figure 90) (第106页)
NVME2.0协议解读 1 min read

队列模型 - 📘 一、完成队列条目:DW2 结构(Figure 90) (第106页)

Blog Author

继续深入分析 NVM Express® Base Specification, revision 2.0b 第 95 页,我们将重点讲解 完成队列条目中的字段结构,特别是 SQ IdentifierSQ Head PointerStatus FieldPhase TagCommand Identifier,以及它们在完成队列中的作用和实现细节。


📘 一、完成队列条目:DW2 结构(Figure 90)

SQ Identifier(SQID)

  • 功能:该字段用于指示命令所属的 提交队列(Submission Queue)
  • 作用
  • 多个提交队列共享一个完成队列 时,SQID命令标识符(CID) 一起,帮助主机软件 唯一确定已完成的命令
  • NVMe over Fabrics 实现中,此字段是 保留的,即在这类实现中不使用。
位(Bits) 描述
31:16 SQID:指示命令所属的提交队列标识符。

SQ Head Pointer(SQHD)

  • 功能:该字段表示 提交队列 的当前头指针,用于指示 已消费的队列项,这些队列项可以被主机重新使用。
  • 作用
  • 控制器在将完成条目放入完成队列时返回此字段的值。
  • 注: 这个值是控制器在创建完成队列条目时的头指针值。主机在消费该完成条目时,控制器的头指针可能已经前进。
位(Bits) 描述
15:00 SQHD:提交队列的头指针,帮助主机了解哪些命令已经被处理。

📘 二、完成队列条目:DW3 结构(Figure 91)

Status Field(SF)

  • 功能:该字段用于指示命令的完成状态,表示该命令是否成功执行,或者是否出现了致命错误或非致命错误。
位(Bits) 描述
31:17 Status Field(SF):表示命令的完成状态,具体的状态码由控制器定义。

状态字段值为 0h,表示命令成功完成,无错误发生。

Phase Tag(P)

  • 功能:此字段用于标识完成队列条目是否为新条目,帮助区分同一队列中的多个条目的处理状态。
  • 作用
  • 主机在设置 CC.EN 时,Phase Tag 被初始化为 0
  • 控制器在放置条目时,Phase Tag 将会反转(0110),以区分新的完成条目。
位(Bits) 描述
16 Phase Tag(P):区分新响应条目和已处理的响应条目。

注意:在 NVMe over Fabrics 实现中,Phase Tag保留的,即在该实现中不使用此字段。


Command Identifier(CID)

  • 功能:此字段表示命令标识符,用于标识与完成队列条目关联的命令。
  • 作用
  • 该标识符是主机在将命令提交到提交队列时分配的,主机可以通过它来追踪特定的命令。
  • CIDSQID 一起,唯一标识命令及其完成状态。
位(Bits) 描述
15:00 CID:命令标识符,主机用来追踪命令的提交与完成状态。

📘 三、状态字段(Status Field)定义(Figure 92)

Do Not Retry(DNR)

  • 功能:如果设置为 1,表示如果该命令重新提交到控制器,预计该命令会失败。
  • 作用
  • 如果发生超时错误恢复(如错误恢复失败),则该字段将被清除为 0
  • 如果命令被标记为不可重试,控制器将不会尝试再次处理该命令。
位(Bits) 描述
31 DNR:标记该命令是否不可重试。

More(M)

  • 功能:此字段指示是否有更多的状态信息可供查询。
  • 作用
  • 如果设置为 1,表示有更多的错误信息可通过 Get Log Page 命令获取。
  • 如果设置为 0,表示没有更多的状态信息。
位(Bits) 描述
30 M:指示是否有更多的状态信息。

🧠 总结与关键点

字段/功能 说明
SQ Identifier 表示命令所属的提交队列,当多个队列共享同一完成队列时,帮助主机区分命令来源。
SQ Head Pointer 提交队列的头指针,帮助主机识别哪些命令已被控制器消费并可以重用。
Status Field 表示命令的完成状态,成功完成时为 0h,错误发生时为其他状态码。
Phase Tag 标识完成队列条目是否为新条目,确保响应顺序一致性。
Command Identifier 唯一标识命令的标识符,主机用它来追踪命令与完成队列条目的关联。
DNR(Do Not Retry) 标记命令是否可以重试,避免因命令失败被重复提交。
More(M) 标识是否有更多的错误信息可通过 Get Log Page 命令查询。

如果你希望继续深入了解:

  • 状态字段(Status Field)中不同状态码的详细定义
  • Phase Tag 的使用方式及其对响应顺序的影响
  • 如何优化命令标识符(CID)和提交队列标识符(SQID)在并发环境下的管理

我可以继续为你提供更深入的解析。你希望接下来进一步探讨哪些内容?