1. 程式人生 > 其它 >NVME(學習筆記七)—Atomicity Operation

NVME(學習筆記七)—Atomicity Operation

5.21.1.10 Write Atomicity Normal

這個特性控制AWUN和NAWUN引數的操作。設定的屬性值在set Feature命令的Dword 11中表明。

如果提交Get Feature命令查詢這個特性,屬性值填寫到completion應答CQE的Dword 0中返回。

【補充知識】

在Feature中設定原子操作的位置在Feature Identitiers的0Ah處,如下:

【參照spdk程式碼如下】

【參考Figure 286 可知,當前只用了一個bit位,參考程式碼如下】

6.4 Atomic Operations 原子操作

對原子操作controller所支援的引數定義概況如下Figure 350。這些引數可能影響命令的行為和執行順序,基於寫大小(基於每個controller或每個namespace)。

在Identity Controller資料結構中,NVM subsystem記錄了在各種條件下能保證原子寫入的大小,這個大小是寫操作的邏輯塊數,這裡說的各種條件包括普通操作、電源失效、以及Compare&Write融合操作。在Identity Controller資料結構中記錄【report】的這些值適用於所有namespace,支援任何namespace格式,它形成一個基線值保證不變化。

一個NVM subsystem可以對這些欄位域,在Identity Namespace資料結構中為每個namespace記錄【report】特定於這個namespace格式的值。如果一個NVM subsystem基於每個namespace記錄值,那麼這些值必須大於或等於在Identity Controller資料結構中表明的相應基線值。

(Namespace) Atomic Write Unit Normal,(Namespace) Atomic Write Unit Power Fail,(Namespace) Atomic Compare & Write Unit 這些在Identity Controller資料結構中或在Identity Namespace資料結構中的欄位域值,對外報告呈現哪一個值,取決於它需要的值是基線還是特定於具體namespace。

controller可以支援Atomic Boundaries,這個邊界要求原子操作不能跨越。Namespace Atomic Boundary Parameters (NABSN, NABO, and NABSPF)對namespace定義這些邊界。如果NABSN或NABSPF被設定了非0值,這個namespace就支援Atomic Boundaries。如果namespace不支援Atomic Boundaries就應該把NABSN和NABSPF欄位域設定為0。Namespace Atomicity Parameter 和 Namespace Atomic Boundary Parameter 值可能是格式特定的,如果namespace格式被修改這些值也可能隨之變化。

在共享namespace的情況下,被單個controller執行的操作對共享namespace在寫原子性級別是原子性的,寫原子性級別按命令提交到的那個controller的相應的Identity Controller或Identity Namespace資料結構中的記錄。

6.4.1 AWUN/NAWUN

AWUN/NAWUN控制命令執行的原子性,是在與其他命令關係方面。它們利用將資料塊寫入NVM時內部命令序列化,防止在NVM上出現包括一部分資料來自一個新命令而一部分資料來自其他一個或多個新命令的資料塊。

如果被提交的寫命令使用的大小小於或等於AWUN/NAWUN值,寫命令也沒有穿越原子邊界,那麼相對於其他讀寫命令,這個到NVM的寫命令做到原子性,對host主機是能夠有保證的。如果被提交的寫命令使用的大小大於AWUN/NAWUN值,或穿越了原子邊界,那麼對命令原子性是沒有保證的。對於那些由於電源失效或其他錯誤條件引起的寫錯誤來說,AWUN/NAWUN沒有任何適用性。

host主機可以通過配置Write Atomicity Normal特性(請參考5.21.1.10章節的feature設定)來設定成不需要AWUN和NAWUN,這種設定可能在一些執行中帶來高效能。

6.4.1.1 AWUN/NAWUN例子

這個例子中,AWUN/NAWUN的值是2K(相當於4個512位元組的邏輯塊),namespace原子邊界大小(NABSN和NABSPF)為0。主機下發兩個寫命令,每個命令的寫長度都是2K。命令A寫LBAs 0-3,命令B寫LBAs 1-4,都是寫四個512位元組的邏輯塊。

由於命令A和命令B的大小都符合小於或等於AWUN/NAWUN的值,controller序列化這兩個寫命令,LBAs 0-4中的結果資料反映出命令A後跟命令B,或者命令B後跟命令A,但不會出現一些邏輯塊被來自命令A的資料寫入而一些邏輯塊被來自命令B的資料寫入這種中間狀態。Figure 351展示LBAs 0-4中資料的有效結果和無效結果的例子。

如果寫命令A和寫命令B的大小超過AWUN/NAWUN的值,那麼順序是無法保證的,命令A和命令B執行後,在指定的LBA範圍內有可能是來自命令A和命令B資料的任意組合。

6.4.2 AWUPF/NAWUPF

AWUPF和NAWUPF指出當電源失效或其他錯誤條件中斷寫操作引起破損(不完整)寫時controller的行為。破損寫是指那些應該連續寫入的資料邏輯塊實際上只有一些儲存到NVM中,剩下的目標邏輯塊處於不確定狀態,或許一些邏輯塊包含原始資料一些邏輯塊包含來自寫操作的新資料。

如果提交的寫命令大小小於或等於AWUPF/NAWUPF值,並且寫命令也沒有超越原子邊界,如果由於電源失效或其他錯誤條件而命令失敗,controller保證隨後的讀命令,讀剛才與寫命令相關的邏輯塊必須返回下邊兩種資料的其中之一:

所有的都是老資料

所有的都是新資料

如果提交的寫命令大小大於AWUPF/NAWUPF值,或寫命令超越原子邊界,那麼對隨後讀出的相關邏輯塊資料不做保證。

6.4.2.1 AWUPF/NAWUPF例子

6.4.3 Atomic Boundaries 原子邊界

原子邊界控制controller如何執行第6.4章節中定義的原子性保證,並在命令中指定LBA範圍的對齊方式。原子邊界僅僅基於每個namespace定義。如果NABSN或NABSPF設定了非0值那麼namespace支援原子邊界。

為確保後向相容,即使寫入跨域了原子邊界,AWUN、AWUPF和ACWU記錄的值也必須要支援它們。如果controller不能保證跨越原子邊界的原子性,則controller應設定AWUN、AWUPF和ACWU為0h(0就表示1個LBA)。

邊界大小必須大於或等於相應的原子寫大小(即:NABSN/NABSPF分別大於或等於NAWUN/NAWUPF)。NABO必須小於或等於NABSN和NABSPF。

對於Boundary Offset (NABO) 和Boundary Size (NABSN或NABSPF) ,如果沒有邏輯塊地址越界,命令中LBA範圍位於Namespace Atomic Boundary之內:對於任意大於等於0的整數y,範圍是Boundary Offset + (y * Boundary Size)。

如果一個寫命令超越了NABSN值指定的原子邊界,那麼基於NAWUN引數的原子性都無法保證。如果寫命令超越了NABSPF值指定的原子邊界,那麼基於NAWUPF引數的原子性都無法保證。

Figure 354展示了一個原子邊界的行為示例。單獨寫到藍色或黃色區域不超越原子邊界。

轉載於:《NVM-Express-1_4-2019.06.10-Ratified》學習筆記(5.21.1.10-加-6.4)Atomic_Operations - JamesLi_1119401255 - 部落格園 (cnblogs.com)