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展示了一個原子邊界的行為示例。單獨寫到藍色或黃色區域不超越原子邊界。