【NVMe2.0b 14-1】Abort、Asynchronous Event Request、Capacity Management command

这篇内容详细介绍了NVMe设备的Abort命令,用于中止先前提交的命令。Abort命令是非强制性的,并且可能在不同状态中完成。此外,还讨论了AsynchronousEventRequest命令,用于接收控制器的异步事件通知,如错误、SMART状态和通知事件。这些事件的完成和处理机制也有明确的规定。最后,CapacityManagement命令用于管理NVMe子系统的容量,包括创建和删除EnduranceGroup和NVMSet,以及配置选择。每个命令的完成过程都会产生相应的队列条目并带有特定的状态信息。

5.1Abort command

Abort 命令用于中止先前提交到 Admin Submission Queue 或 I/O Submission Queue 的特定命令。Abort 命令一个是尽力而为的命令; 一个Abort命令可能已经完成,正在执行中,或者可能已在排的很深的队列中。

要中止大量命令(例如,超过 ACL 字段中列出的限制的命令数量),主机应按照第 3.7.3 节中描述的程序删除 I/O Submission Queue 并重新创建 I/O Submission Queue。

Abort 命令使用 Command Dword 10 字段。保留所有其他命令特定字段。

Identify Controller data structure 中的 Abort Command Limit 字段(参见Figure 275)指示对 Abort 命令并发执行的控制器限制。主机不应允许未完成的 Abort 命令的数量超过此值。控制器可以以 Abort Command Limit Exceeded 状态完成任何多余的 Abort 命令。

Figure 140: Abort – Command Dword 10
Bits Description
31:16 Command Identifier (CID): 该字段指定要中止的命令的命令标识符,该标识符在命令本身的 CDW0.CID 字段中指定。
15:00 Submission Queue Identifier (SQID): 该字段指定与要中止的命令相关联的 Submission Queue 的标识符。

5.1.1Command Completion

在完成 Abort 命令后,控制器将完成队列条目发布到 Admin Completion Queue,指示 Abort 命令的状态并指示要中止命令是否被中止。完成队列条目的 Dword 0 指示要中止的命令是否已中止。

如果要中止的命令已经成功被abort,那么在Abort 命令的CQE发送到Admin Completion Queue之前被中止命令的CQE要发布到合适的Admin或I/O Completion Queue, 并且status code为Command Abort Requested,并且应将 Abort 命令的完成队列条目中Dword 0 的bit 0清为“0”。如果要被种植的命令没有因任何原因中止,则应给Abort命令的完成队列条目Dword 0 的 bit 0设置为“1”。

与 Abort 命令相关的命令特定状态值在Figure 141 中定义。

Figure 141: Abort – Command Specific Status Values
Value Description
3h Abort Command Limit Exceeded: 同时未完成的 Abort 命令的数量已超过 Identify Controller data structure 中指示的限制。

5.2Asynchronous Event Request command

异步事件用于在这些事件发生时将状态、错误和健康信息通知主机软件。为了使控制器能够上报异步事件,主机软件需要向控制器提交一个或多个 Asynchronous Event Request 命令。控制器通过完成 Asynchronous Event Request 命令向主机指定事件。主机软件应该预期控制器可能不会立即执行命令;该命令应在有事件要报告时完成。

Asynchronous Event Request 命令由主机软件提交,以启用来自控制器的异步事件报告。此命令没有timeout。当有异步事件要报告给主机时,控制器会发布此命令的完成队列条目。如果在控制器reset时异步事件请求命令未完成,则这些命令中的每一个都将中止并且不应返回 CQE。

保留所有命令特定字段。

主机软件可以提交多个 Asynchronous Event Request 命令以减少事件报告延迟。同时未完成的异步事件请求命令的总数受Figure 275 中 Identify Controller data structure 中指定的 Asynchronous Event Request Limit 的限制。

异步事件分为多个事件类型。事件类型在异步事件请求命令的完成队列条目的 Dword 0 中的 Asynchronous Event Type字段中指示。当控制器为未完成的 Asynchronous Event Request 命令发布完成队列条目并因此报告异步事件时,控制器自动屏蔽该事件类型的后续事件,直到主机清除该事件。除非另有说明,否则可以通过使用 Get Log Page 命令读取与该事件关联的 log page 来清除事件(请参阅第 5.16 节)。如果由于 media 未准备好而无法访问该 log page(即,对于请求该日志页的 Get Log Page 命令,控制器返回 Admin Command Media Not Ready 状态码),则控制器不应为该异步事件发布完成队列条目,直到控制器能够成功返回需要读取以清除异步事件的 log page。

定义了以下事件类型:

  a)Error event: 表示与特定命令无关的一般错误(参见 Figure 144)。要清除此事件,主机软件使用 Get Log Page 命令读Error Information log (参见第 5.16.1.2 节)

NVMe 2.0协议中,Asynchronous Event Request属于Admin Command Set,该命令集定义了可提交到Admin Submission Queue的命令,提交队列条目 (SQE) 结构和所有Admin命令共有的字段在第3.3.3节中定义,完成队列条目 (CQE) 结构和所有Admin命令共有的字段在第3.3.3.2节中定义,且Admin命令不受I/O queues状态的影响,如完整的I/O Completion Queue不会延迟或停止Delete I/O Submission Queue命令[^5]。 对于Asynchronous Event Request命令,如果发生启用报告的事件并且没有未完成的Asynchronous Event Request命令,控制器应保留Asynchronous Event Type的事件信息,并将该信息用作对接收到的下一个异步事件请求命令的响应。若Get Log Page命令在接收到异步事件请求命令之前清除了事件,或者发生断电情况,则不会发送通知。若发生多个相同类型的事件,且这些事件对异步事件请求命令具有相同的响应,那么这些事件可作为对Asynchronous Event Request命令的单个响应进行报告。若发生了多个不同类型的事件或对Asynchronous Event Request命令具有不同响应的事件,控制器应保留这些事件的队列,以便在对后续Asynchronous Event Request命令的响应中进行报告[^2]。 如果SSD希望在没有接收到可用的Asynchronous Event Request命令时上报Asynchronous Event,需要在接收到Asynchronous Event Request命令时发送一个该事件类型的notification给Host[^1]。 以SMART / Health Status event为例,该事件指示SMART / Health状况事件。要清除此事件,主机软件使用Get log Page命令读取SMART / Health Status event信息日志,同时将Retain异步事件位清除为' 0 ',可在异步事件配置特性中使用Set Features命令配置触发异步事件的SMART / Health状况条件[^4]。 ```python # 这里简单模拟一下Asynchronous Event Request相关逻辑 # 假设一个模拟的NVMe控制器类 class NVMeController: def __init__(self): self.event_queue = [] def receive_event(self, event_type): self.event_queue.append(event_type) def handle_asynchronous_event_request(self): if self.event_queue: response = self.event_queue.pop(0) return f"Response to Asynchronous Event Request: {response}" return "No event to report" controller = NVMeController() controller.receive_event("SMART / Health Status event") print(controller.handle_asynchronous_event_request()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值