《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.2)-- Asynchronous Event Request command
5.2 异步事件请求命令
异步事件用于当状态、错误、健康信息这些事件发生时通知主机软件。为了使能这个controller报告的异步事件,主机软件需要提交一个或多个异步事件请求命令到controller。controller通过完成一个异步事件请求命令到主机来详细描述一个事件。主机软件应当期望controller可能不是立即执行这个命令,当有一个事件需要报告给主机时这种命令才会被完成。
异步事件请求命令由主机软件提交来使能从controller的异步事件报告。这种命令不会超时。当有一个异步事件时controller为这个命令推送一个CQE报告给主机。如果当controller被重启时有异步事件请求命令待处理,那么这些命令被abort,不回复CQE。
所有特定于命令的字段都被保留。
主机软件可以提交多个异步事件请求命令来减小报告时延。并存待处理的异步事件请求命令的总数是有限的,限制由Identify Controller数据结构中的Asynchronous Event Request Limit指定,请参照Figure 247。
【附加:AERL字段占用一个字节,为便于查看,从Figure 247的Identify Controller data structure中截取出对应的字段如下】
异步事件们被分组到不同的事件类型中,事件类型信息在CQE的Dword 0中为异步事件请求命令做标识。当Controller为一个待处理异步事件请求命令发送CQE,这样报告一个异步事件,在主机清除这个事件之前,本事件类型的随后的事件被自动的屏蔽。主机清理事件的方式是通过使用Get Log Page命令读对应事件的log page(参考第5.14章节)。
已定义的事件类型如下:
a)Error event:表明一个非特定于此命令的常规错误(参考Figure 145)。主机软件使用Get Log Page命令且Retain Asynchronous Event位设置为0读取这个Error Information log(参考第5.14.1.1章节)来清除这个事件。
b)SMART/Health Status event:表明一个SMART或Health状态事件(参考Figure146)。主机软件使用Get Log Page命令且Retain Asynchronous Event位设置为0读取这个SMART/Health Information log(参考第5.14.1.2章节)来清除这个事件。触发异步事件的条件是可以在Asynchronous Event Configuration特性中使用Set Feature命令来配置的(参考5.21章节)。
c)Notice event:表明一个常规事件(参考Figure 147)。参照Figure 147中的描述,主机软件读取适当的日志页来清除这个事件。触发异步事件的条件可以在Asynchonous Event Configuration特性中使用Set Feature命令(参考第5.21.1.11章节)来配置。这些notice事件包括:
A. Namespace Attribute Changed;
B. Firmware Activation Starting;
C. Telemetry Log Changed;
D. Asymmetric Namespace Access Change;
E. Predictable Latency Event Aggregate Log Change;
F. LBA Status Information Alert; and
G. Endurance Group Event Aggregate Log Page Change;
d)NVM Command Set Specific event:事件是由I/O命令集来定义的:
A. Reservation Log Page Available event:预订日志页可用事件表明一个或多个Reservation Notification日志页(参考第5.14.1.16.1章节)是空闲可用的。主机软件使用Get Log Page命令且Retain Asynchronous Event位设置为0读取这个Reservation Notification日志页来清除此事件;
B. Sanitize Operation Completed event:无害化【让介质上数据毁尸灭迹无法恢复】操作完成事件表明无害化操作已经完成(包括任意相关联的附加的介质修改,参考Figure 247中的No-Deallocate Modifies Media After Sanitize 字段),在Sanitize Status日志页(参考第5.14.1.16.2)中所有LBAs不存在意外未释放和状态可用的情况。主机软件使用Get Log Page命令且Retain Asynchronous Event位设为0读取Sanitize Status日志页来清除此事件;
C. Sanitize Operation Completed With Unexpected Deallocation event:表明无害化操作已经完成,在Sanitize Status日志页中,对于所有LBAs和状态可用,存在意外的解除分配。主机软件使用Get Log Page命令且Retain Asynchronous Event位设为0读取Sanitize Status日志页来清除此事件。
e)Vendor Specific event:厂商特定时间表明一个特定厂商的事件。主机软件使用Get Log Page命令且设置Retain Asynchronous Event位为0读取这个表明特定厂商日志页来清除此事件。
如果控制器支持Sanitize Config特性,则应该支持Sanitize Operation Completed With Unexpected Deallocation异步事件。
异步事件被报告是因为有新条目加进一个日志页(例如Error Information日志)或状态更新(例如SMART/Health日志中的状态)。一个状态变化或许永久的(例如介质变成了只读)或短暂的(例如某个时间周期温度达到或超过一个临界值)。发布另一个异步事件请求命令之前,主机软件应该更改这个事件临界值或屏蔽这个事件,以避免异步事件重复的报告。
【1-1】关于异步事件上报已经被使能,但没有异步事件命令待处理的情况,如果事件发生,Controller应该保留该异步事件类型的事件信息,并将该信息用作对接收到的下一个异步事件请求命令的相应。【1-2】如果在接收到异步事件请求命令之前一个Get Log Page命令清除了此事件或者发生了掉电关机情况,那么通知不发送。【2-1】如果相同类型的多个事件且对异步事件请求命令具有完全相同应答的事件发生,那么这些事件可以作为一个单个应答给异步事件请求命令。【2-2】如果多个不同类型的事件产生,那么controller应该保留这些事件的队列,以便在应答后续异步事件请求命令时上报。
5.2.1 Command Completion
如果有异步事件需要报告给主机,就从Admin CQ发送一个CQE。与异步事件请求相关的命令特定状态值定义在Figure 143中。
CQE的Dword 0 包含关于异步事件的信息。CQE的Dword 0的定义在Figure 144 中。
【为了便于直观理解 Figure 144,参考下边SPDK代码截图,左边spdk_nvme_async_event_completion是对CQE的Dword 0 做的按位定义】
下边不论是Figure 145,Figure 146,Figure 147,还是Figure 148中的信息,是用于在Asynchronous Event Information字段域中被返回的,具体依赖于异步事件的类型。