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字段域中被返回的,具體依賴於異步事件的類型。





