End to End Data Protection (端到端数据保护),两端分别是指系统这边的Application,以及SSD这边的NAND。当SSD支持这个功能时,在正常的Logical User Data (用户数据)之外,Meta Data (元数据)里会包括Protection Info (保护信息)。
业界最常用的数据保护机制是SCSI协议里的DIF(data integrity field)和DIX (data integrity Extension),两者的区别在于DIF的PI (Protection Info)是跟User Data放在一起,而DIX的PI则是存放在一块独立的buffer里。
NVMe提供类似的数据保护方式,分为Type1,Type2,Type3。Type的选择需要在Format namespace时指定,并且会通过回复Identify Namespace上报给Host。
NVMe的PI一共8个Byte, 分别是Guard, Application Tag和Reference Tag,如下图:
PRACT
SSD收到带有PI数据的读写命令时,其处理方式跟PRACT(Protection Information Action)位的值有关。
先看写命令的情况:
- 如果namespace在format的时候没有启动E2E数据保护,针对Host过来的Logical User Data和Meta,SSD(NVMe模块)不会做任何处理,直接交给后端的Flash Controller模块处理。
- 如果namespace在format的时候启动了E2E数据保护且PRACT=0,SSD接收到Host传来的数据后会检查PI,如果检查失败,SSD会向Host返回命令失败,并置上相应的错误位(Guard check, App Tag Check 和 Ref Tag Check)。
- 如果namespace在format的时候启动了E2E数据保护且PRACT=1,并且Metadata size= 8Byte,SSD会生成PI信息并跟User Data一起写入Flash。
- 如果namespace在format的时候启动了E2E数据保护且PRACT=1,并且Metadata size > 8Byte (比如16 Byte),SSD会生成并覆盖原有的PI信息,跟User Data一起写入Flash。
读命令的情况:
- 如果namespace在format的时候启动了E2E数据保护且PRACT=0,SSD从Flash读出数据以后会检查PI,如果检查失败,SSD会向Host返回命令失败,并置上相应的错误位(Guard check, App Tag Check 和 Ref Tag Check)。
- 如果namespace在format的时候启动了E2E数据保护且PRACT=1,并且Metadata size= 8Byte,SSD从Flash读出数据以后会检查PI信息,如果失败,向Host返回命令失败,如果通过,去掉PI(也就是Meta data)仅将User Data返回给Host。
- 如果namespace在format的时候启动了E2E数据保护且PRACT=1,并且Metadata size > 8Byte (比如16 Byte),SSD从Flash读出数据以后会检查PI信息,如果失败,向Host返回命令失败,如果通过,将包含PI的Meta data连同User Data一起返回给Host。
PRCHK
PRCHK(Protection Information Check)控制PI具体检查的内容。
- 如果PRCHK bit2=1,SSD比较PI中的Guard与User Data的CRC-16
- 如果 PRCHK bit1=1,SSD比较PI中的App Tag与读写命令里的LBAT (Logical Block Application Tag)位的内容
- 如果PRCHK bit0=1
- 针对 Type1 Protection,SSD比较PI中的Ref Tag与计算出的参考Ref Tag,如果检查失败,向Host 返回命令失败;
- 参考Ref Tag包含在读写命令的ILBRT- Initial logical Block Reference Tag 或者 ELBRT- Expected logical Block Reference Tag 中;
- 针对Type 1和Type 2 Protection,参考Ref Tag随着LBA增加递增;
- 针对Type3 Protection,参考Ref Tag保持不变;
- 针对Type1 Protection,Host必须保证ILBRT和ELBRT与LBA的最后4个Byte相等;
- 针对Type2 Protection,SSD检查PI的方式与Type1 相同,不同处在于Host可以任意指定ILBRT和ELBRT;
- 针对Type3 Protection,SSD不会检查ILBRT和ELBRT,同时可以直接Abort这个命令;
- 针对Type1和Type 2 Protection,如果App Tag=0xFFFF,PI check会被Disable
- 针对Type 3 Protection,如果Ref Tag=0xFFFFFFFF,PI check会被Disable
提示:使用NVMe CLI 工具Format Namespace时,可以指定是否启用E2E data protection,并设置Protection Type, PRACT, PRCHK。