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.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展示了一个原子边界的行为示例。单独写到蓝色或黄色区域不超越原子边界。

NVME(学习笔记七)—Atomicity Operation的更多相关文章
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...
- Java IO学习笔记七:多路复用从单线程到多线程
作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...
随机推荐
- Nacos源码 (5) Grpc服务端和客户端
Nacos 2.x在服务端与客户端直接增加了GRPC通信方式,本文通过2.0.2版本源码,简单分析GRPC通信方式: 服务器启动 客户端连接 客户端心跳 服务器监控检查 服务器 proto文件 api ...
- 【译】Visual Studio 2013 退役 :旧版本 Visual Studio 的支持提醒
新年到了,也是提醒我们 Visual Studio 支持生命周期中即将到来的日期的好时机.对 Visual Studio 2013 的支持将于今年4月9日结束.如果您使用的是旧版本的Visual St ...
- 单例bean与原型bean的区别
在使用Spring开发时,Spring提供了五种scope,分别为singleton,prototype,request,session,global session. 上图为各个scope描述的官方 ...
- 【scikit-learn基础】--『回归模型评估』之偏差分析
模型评估在统计学和机器学习中具有至关重要,它帮助我们主要目标是量化模型预测新数据的能力. 本篇主要介绍模型评估时,如何利用scikit-learn帮助我们快速进行各种偏差的分析. 1. **R² ** ...
- VMware虚拟机部署Linux Ubuntu系统的方法
本文介绍基于VMware Workstation Pro虚拟机软件,配置Linux Ubuntu操作系统环境的方法. 首先,我们需要进行VMware Workstation Pro虚拟机软件的 ...
- [转帖]linux之iftop命令
https://rumenz.com/rumenbiji/linux-iftop.html Linux安装iftop > yum install iftop -y > iftop 界面如下 ...
- [转帖]超线程 Smt 究竟可以快多少?
https://www.51cto.com/article/686171.html 刚才我们关闭SMT是把CPU10-CPU19全关了,只留下每对里面的1个CPU,也就是留下了CPU0-CPU9. 默 ...
- iframe父页面传递参数给子页面
父页面通过ifarame传递参数 有些时候,我们需要在嵌套页面. 我们就需要使用iframe了. 通过iframe传递参数给子页面. 需求描述,当我们点击按钮的时候. 传递参数给子页面.子页面接受后展 ...
- js设置setAttribute、获取getAttribute、删除removeAttribute详细讲解
setAttribute的理解 所有主流浏览器均支持 setAttribute() 方法. element.setAttribute(keys,cont) keys==>必需(String类型) ...
- vue动画appear 实现页面刚展示出来的时候,入场效果
<style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0; transform: translateY(80px); } . ...