NVMe 队列数据结构与命令仲裁机制
3.3.3Queueing Data Structures
3.3.3.1Submission Queue Entry
每个通用命令格式命令的大小为 64 字节。
Command Dword 0、Namespace Identifier、Metadata Pointer、PRP Entry 1、PRP Entry 2、SGL Entry 1 和 Metadata SGL Segment Pointer 对所有 Admin 命令和所有 I/O Command Sets 的 I/O 命令具有通用定义。并非所有命令都使用 Metadata Pointer、PRP Entry 1、PRP Entry 2 和 Metadata SGL Segment Pointer。Command Dword 0 在 Figure 86 中定义。
Common Command Forma 在Figure 87中定义。将来定义的任何额外的 I/O Command Set都可以使用替代命令大小或格式。
SGL 不得用于 NVMe over PCIe 中的Admin命令。
除了为 Common Command Format 通常定义的字段外,Admin 和 NVM Vendor Specific命令可能支持Data Transfer中的Number of Dwords和Metadata Transfer中的Number of Dwords字段。如果支持,Admin Vendor Specific Command 和 NVM Vendor Specific Commands 的命令格式在Figure 88 中定义。有关更多详细信息,请参阅第 8.23 节。
3.3.3.2Common Completion Queue Entry
Common Completion Queue Entry Layout 的大小至少为 16 个字节。Figure 89 描述了遵循 Common Completion Queue Entry Layout 的完成队列条目数据结构的前 16 个字节的布局。Dword 0 和 Dword 1 的内容是特定于命令的。如果命令使用 Dword 0 或 Dword 1,则这些 dword 的定义包含在相关的命令定义中。如果命令不使用 Dword 0 或 Dword 1,则保留未使用的字段。Dword 2 在 Figure 90 中定义,Dword 3 在Figure 91 中定义。
如果完成队列条目是通过多次写入来构建的,则Phase Tag位应在该完成队列条目的最后一次写入中更新。
3.3.3.2.1Status Field 定义
Status Field 定义完成队列条目中指示的命令的状态,在Figure 92 中定义。
Status Field 的值 0h 表示命令成功完成,没有致命或非致命错误条件。除非另有说明,如果命令由于多种原因未能成功完成,则返回的特定状态代码,由供应商选择。
完成队列条目指示正在报告的完成响应的 Status Code Type(SCT)。Figure 93 指定了状态码类型值和描述。
完成队列条目中的Status Code(SC) 字段指示有关正在报告的完成的更详细的状态信息。
每个 Status Code 值集分为三个范围:
- 00h 到 7Fh:适用于Admin Command Set,或跨多个Command Set;
- 80h到 BFh:I/O Command Set具体状态码;
- C0h 到 FFh:供应商特定状态代码。
除非另有说明,否则如果应用多个状态代码,则由控制器选择返回的 Status Code。
3.3.3.2.1.1Generic Command Status Definition
具有 Generic Command Status 的 Status Code Type(SCT) 的完成队列条目指示与该命令关联的状态值,该状态值在许多不同类型的命令中是通用的。
3.3.3.2.1.2Command Specific Status 定义
具有命令特定错误Status Code Type (SCT) 的完成队列条目表示特定命令opcode的错误。00h 到 7Fh 的状态代码用于 Admin 命令错误。80h 到 BFh 的状态码特定的 I/O command sets。
3.3.3.2.1.3Media and Data Integrity Errors定义
具有Media and Data Integrity Errors的 Status Code Type(SCT) 的完成队列条目指示与命令关联的错误,该错误是由于与 NVM 介质关联的错误或数据完整性类型错误造成的。
3.3.3.2.1.4Path Related Status定义
具有Path Related Status的 Status Code Type(SCT)(参见Figure 99)的完成队列条目指示与命令关联的状态值,该状态值在许多不同类型的命令中是通用的,并适用于主机和控制器处理之间的特定连接命令或控制器和命名空间之间。如果主机可以使用多个控制器,则可以在同一 NVM 子系统中的不同控制器上重试返回此状态的命令。
在多路径环境中,除非另有说明,否则应使用不同的路径(如果可用)重试此类错误。
3.3.3.3Queue Size
队列大小在一个基于 0 的 16 位字段中表示,该字段表示队列中的槽数。队列的最小大小是两个槽。I/O Submission Queue 或 I/O Completion Queue 的最大大小定义为 64 Ki 个槽,受 CAP.MQES 字段中报告的控制器支持的最大队列大小限制。Admin Submission 和 Admin Completion Queue 的最大大小定义为 4 Ki 个槽。由于Head和Tail条目指针的定义,每个队列中有一个槽不可用。
3.3.3.4Queue Identifier
每个队列都通过一个 16 位 ID 值标识,该 ID 值在创建队列时分配给该队列。I/O Submission Queue标识符和 I/O Completion Queue 标识符都是从 1 到 65,535 的值。
3.3.3.5队列优先级
如果支持具有紧急优先级等级仲裁机制的加权轮询,则主机软件可以分配Urgent、High、Medium或Low的队列优先级服务等级。如果不支持具有紧急优先级等级仲裁机制的加权轮询,则不使用优先级设置并且被控制器忽略。
3.3.3.6队列协调
有一个Admin Queue对与多个 I/O Queue 对关联。Admin Submission Queue 和 Completion Queue 用于执行影响整个控制器的功能。I/O Submission Queue 和 Completion Queue 可用于执行 I/O(读/写)操作,并可分布在 CPU 内核和线程之间。
一个Admin命令可能会影响一个或多个 I/O queue 对。主机应确保Admin操作与负责 I/O queue 对的线程协调,以避免不必要的错误情况。协调细节超出了本规范的范围。