NVMe Base 2.4:Device Self-test:執行、進度與結果
00.01.Device Self-test 讓控制器在背景執行內部測試。讀懂這項功能,必須分清「接受測試要求」、「正在測試」與「留下測試結果」三件事;主機收到命令成功完成,並不表示裝置已通過測試。
這篇的主軸
決定測試對象
01-01先確認支援能力,再選擇測試種類及要納入的 namespace;控制器接受要求後,才開始背景測試。
- namespace
- namespace,主機透過 controller 存取的一份已格式化非揮發性容量。
追蹤正在進行的作業
02-01用目前作業與完成百分比回答「是否還在測試、做到哪裡」;新的命令、重設或中止要求可能影響進行中的作業。
判讀留下的結果
03-01測試停止後,再看結果紀錄。先確認哪些欄位有效,才能解釋失敗位置與相關資訊。
把主軸連起來
00.02.先確認控制器支援哪些測試,再選擇測試種類與 namespace,送出命令後觀察目前作業及進度,最後閱讀歷史結果與有效性標記。相同的 Get Log Page 可以在不同時間回答「做到哪裡」和「最後結果如何」,但兩者使用不同欄位。
01 Device Self-test 的啟動與執行
01.01.Self-test 不是同步 diagnostic RPC。Host 先用 OACS.DSTS、DSTO.SDSO 與 EDSTT 決定支援、concurrency scope 與時間預期,再用 NSID 與 STC 建構 command。Admin CQE 回來時,背景 operation 才剛進入可由 LID 06h 觀察的生命週期。
- OACS.DSTS
- Optional Admin Command Support 的 Device Self-test Supported bit,判斷 command 是否可用。
- LID 06h
- Device Self-test Log Page 的 identifier 06h;同時包含 current operation 與 20 筆歷史結果。
- Admin
- Administrative,建立、設定、查詢或管理 controller 與 queue 的控制路徑。
- EDSTT
- Extended Device Self-test Time,在 power state 0 下的 extended test 名目完成分鐘數。
- DSTO
- Device Self-test Options,Identify Controller 中回報 refresh 與 concurrency 選項的欄位。
- Host
- 主機;執行作業系統並送出 NVMe 命令的一端。
- NSID
- Namespace Identifier,controller 用來指向 namespace 的數值 handle;identifier 不等於 namespace 物件本身。
- SDSO
- Single Device Self-test Operation,選擇 subsystem-wide 單一 operation 或 per-controller operation 的 bit。
- CQE
- Completion Queue Entry,CQ 中的一筆完成結果資料結構。
- LID
- Log Page Identifier;指定要讀取哪一種 log page 的編號。
- STC
- Self-test Code 是 Device Self-test CDW10 的動作 nibble;result entry 的 STC 則是 Status Code,須依 SCVLD 判斷有效。
01.02.啟動 Device Self-test 前,先讀 Identify Controller:OACS.DSTS 判斷 command 是否支援;EDSTT 是 extended operation 在 power state 0 的名目分鐘數;DSTO.SDSO 決定同時只能有一個 subsystem-wide operation,或每個 controller 各一個。這三個欄位回答不同問題。
- controller
- controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
來源:Base 2.4 §5.2.14.2.1, 8.1.8
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.1, 8.1.8, 文件頁 352-358, 614, PDF 頁 378-384, 640
| 測試對象或控制值 | 涵蓋的範圍或動作 | 執行與結果的規則 |
|---|---|---|
| NSID=0 | 只包含 controller | 不測 namespace media |
| 目前可存取的 NSID | 指定 namespace | invalid 與 inactive status 不同 |
| NSID=FFFFFFFFh | 所有 attached/accessible namespaces | 集合以 start 時點為準 |
| STC=Fh | abort current operation | 成功不代表曾有 operation |
02 LID 06h 的目前進度與歷史結果
02.01.log header 的 DSTOS/DSTCS 回答『現在跑到哪裡』;RDS1~RDS20 回答『之前怎麼結束』。result entry 又分成 operation code、result reason、segment、validity bitmap 與 diagnostic payload。NVM Command Set 只在 FVLD=1 時賦予 FLBA 明確的 LBA 語意。
- DSTCS
- Device Self-test Completion Status,LID 06h 中的 0 到 100 完成百分比。
- DSTOS
- Device Self-test Operation Status,LID 06h 中表示目前 operation 類型的 nibble。
- FLBA
- Failing LBA,NVM Command Set 定義為造成 self-test failure 的其中一個 logical block address。
- FVLD
- Failing LBA Valid,決定 FLBA 欄位是否可解讀的 validity bit。
- NVM
- Non-Volatile Memory,斷電後仍能保存資料的記憶體。
02.02.讀取 LID 06h 所需的最小 Get Log Page slice 是:LID=06h、LSP=0、RAE 依事件策略選擇、NUMD 表示 564 bytes、LPOL/LPOU=0、OT=0、CSI=0、UIDX=0。564 bytes=141 dwords,因此 0's-based NUMD=140=008Ch;RAE=0 時 CDW10=008C0006h。
- 0's-based
- 0's-based encoding,以 0 表示實際數量 1;依欄位換算公式通常是欄位值加 1。
- LPOL
- Log Page Offset Lower,Get Log Page byte offset 的低 32 bits。
- LPOU
- Log Page Offset Upper,Get Log Page byte offset 的高 32 bits。
- NUMD
- Number of Dwords,0's-based transfer dword count;實際 bytes = (NUMD + 1) × 4。
- UIDX
- UUID Index,指向 UUID List 位置的 index;0 表示未指定 UUID。
- CSI
- I/O Command Set Identifier;選擇 I/O 命令集,NVM Command Set 使用 00h。
- LSP
- Log Specific Field,意義由所選 log page 定義的 command selector。
- RAE
- Retain Asynchronous Event,Get Log Page 是否保留相關 asynchronous event 的 selector。
來源:Base 2.4 §5.2.13
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13, 文件頁 213-216, PDF 頁 239-242
| 進度或歷史欄位 | 描述什麼資訊 | 何時可以使用這個欄位 |
|---|---|---|
| DSTOS/DSTCS | current state/progress | DSTOS=0 時忽略 percentage |
| DSTR=7h + SEGN | 已知第一個 failed segment | 其他 DSTR 忽略 SEGN |
| FVLD + FLBA | 其中一個 failing LBA | 不是所有失敗 LBA 清單 |
| POH + STCT/STC | failure context | 仍需 validity bits |
- DSTR
- Device Self-test Result,結果 entry 中表示成功、abort 或 segment failure 的 nibble。
- SEGN
- Segment Number,只有 DSTR=7h 時指出第一個失敗 diagnostic segment。
- POH
- Power On Hours,self-test result 建立時累積的 power-on hours,不含指定 low-power 時間。
接著打開 Spec 看什麼
03.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。
| 要說明的觀念 | Spec 閱讀位置 |
|---|---|
| Device Self-test 的啟動與執行 | Base 2.4 §5.2.14.2.1, 8.1.8 · Base 2.4 §5.2.6 |
| LID 06h 的目前進度與歷史結果 | Base 2.4 §5.2.13 · Base 2.4 §5.2.13.1.7 · NVM 1.3 §4.1.4.3 |
學完後想一想
1. Device Self-test 啟動命令成功後,如何知道測試是否還在執行?
04.01.啟動 completion 不包含整個測試的最終結果。Device Self-test log 的 current operation 與 completion percentage 描述目前進度;結果紀錄則用於已結束的測試。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.6, 文件頁 201, PDF 頁 227
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 229-230, PDF 頁 255-256
2. Self-test result 中 FLBA 看起來是合理地址,就一定可以當作失敗位置嗎?
04.02.要先檢查對應的 validity bit;未宣告有效時不能依數值推論。即使有效,也可能只描述多個失敗 logical blocks 中的一個,並非完整範圍。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.7, 文件頁 231-232, PDF 頁 257-258
來源:NVME-NVM-CS-1.3, Rev. 1.3, §4.1.4.3, 文件頁 76, PDF 頁 76


Comments