管理命令集 - 1. 删除 I/O 完成队列 (Delete I/O Completion Queue) 命令 (第170页)
在深入分析 NVM Express® Base Specification, revision 2.0b 的内容时,特别关注 删除 I/O 队列 和 删除 I/O 提交队列 的相关命令及其操作细节,以下是这些内容的详细讲解:
1. 删除 I/O 完成队列 (Delete I/O Completion Queue) 命令
命令描述:
删除 I/O 完成队列的命令用于删除指定的完成队列。该命令包括以下关键点: - 命令字 10 (Command Dword 10): - 31:16:保留字段(Reserved)。 - 15:00:队列标识符 (Queue Identifier, QID),指定要删除的完成队列的标识符。需要注意的是,值为 0h 时表示 Admin 完成队列,不能删除 Admin 完成队列。
命令完成:
- 在删除 I/O 完成队列的命令执行完成后,控制器会在 Admin 完成队列上发布一个完成队列条目。
- 命令特定状态值:命令执行后的状态可以是以下几种:
- 01h (无效的队列标识符 Invalid Queue Identifier):指定的队列标识符无效,或者指定的是 Admin 完成队列的标识符。
- 0Ch (无效的队列删除 Invalid Queue Deletion):尝试删除的 I/O 完成队列无效,通常这是因为存在一个未删除的关联 I/O 提交队列。
特别注意:
- 无法删除 Admin 完成队列,即无法删除编号为 0h 的完成队列。
2. 删除 I/O 提交队列 (Delete I/O Submission Queue) 命令
命令描述:
删除 I/O 提交队列的命令用于删除指定的提交队列。删除提交队列的过程涉及到队列的清理与完成状态的处理: - 命令字 10 (Command Dword 10): - 31:16:保留字段(Reserved)。 - 15:00:队列标识符 (Queue Identifier, QID),指定要删除的提交队列的标识符。与删除完成队列相同,值为 0h 时表示 Admin 提交队列,同样不能删除。
命令完成:
- 在删除 I/O 提交队列命令完成后,提交队列中之前提交的所有 I/O 命令将被显式完成或隐式完成。
- 在返回删除提交队列命令的完成队列条目之前,已提交到要删除的队列中的其他命令可能会以适当的状态完成。例如,命令可能以“成功完成”或因队列删除而“命令中止”状态完成。
- 删除提交队列命令成功完成后,控制器不会为已提交到已删除提交队列的任何 I/O 命令发布完成状态。
- 删除提交队列命令成功完成后,表示所有未发布完成条目的 I/O 命令都将隐式完成,并且它们的完成状态将为“命令因提交队列删除而中止”。
特别注意:
- 无法删除 Admin 提交队列,即无法删除编号为 0h 的提交队列。
命令特定状态值:
- 命令完成后的状态可以是以下几种:
- 01h (无效的队列标识符 Invalid Queue Identifier):指定的队列标识符无效,或者指定的是 Admin 提交队列的标识符。
- 0Ch (无效的队列删除 Invalid Queue Deletion):尝试删除的 I/O 提交队列无效,通常是由于存在未删除的关联 I/O 完成队列。
总结:
- 删除 I/O 完成队列和提交队列的命令都具有严格的队列标识符验证,并且存在对队列间依赖关系的约束。例如,删除 I/O 完成队列前必须确保相关的 I/O 提交队列已删除,反之亦然。
- 在执行这些命令时,必须严格遵循规范中列出的标识符和状态值。特别地,Admin 队列是不可删除的,并且需要在删除操作前完成相关队列的清理。
这些删除操作对于管理 I/O 资源的释放与队列的清理非常重要,确保系统稳定运行。