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

转载于:《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.21.1.10-加-6.4)Atomic_Operations - JamesLi_1119401255 - 博客园 (cnblogs.com)

NVME(学习笔记七)—Atomicity Operation的更多相关文章

  1. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  2. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  3. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  5. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

  6. iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】

    iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...

  7. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  8. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  9. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  10. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

随机推荐

  1. 神经网络优化篇:详解学习率衰减(Learning rate decay)

    学习率衰减 加快学习算法的一个办法就是随时间慢慢减少学习率,将之称为学习率衰减,来看看如何做到,首先通过一个例子看看,为什么要计算学习率衰减. 假设要使用mini-batch梯度下降法,mini-ba ...

  2. 【Python】.format用法

    格式化打印 print("***{}".format(args))   格式化转换 module = "skull" print "MODULE_{} ...

  3. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.11)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  4. [转帖]pyinstaller实现将python程序打包成exe文件

    https://www.cnblogs.com/blogzyq/p/13939739.html 如果我们想要在一个没有python以及很多库环境的电脑上使用我们的小程序该怎么办呢? 我们想到,在Win ...

  5. [粘贴]使用 Dumpling 导出数据

    https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#dumpling-%E4%B8%BB%E8%A6%81%E9%80%89%E9%A1 ...

  6. [转帖]部署Alertmanager

    https://flashcat.cloud/docs/content/flashcat-monitor/prometheus/alert/manager-install/ Alertmanager和 ...

  7. [转帖]美国出口管制条例(EAR)简介

    https://zhuanlan.zhihu.com/p/87962305 第一节.美国出口管制法律体系 下述一系列法律.法规及规则,构成美国完整的出口管理制度,是美国各相关执法部门执法的主要法律依据 ...

  8. 如何写出高质量的代码 data 组件 函数 注释 命名 变量的次数

    今天在将以前文件上传的地方全部 改为新的文件上传的api. 在改动的过程中,发现代码有很多不合理的地方 在改的时候,因此也是非常的痛苦的哈. 比如说在data中我有太多的flag标识.俩控制元素的显示 ...

  9. SignalR系列文章02---netCoreMvc创建Demo

    1.  新建.net core MVC项目,并引入nuget包 2.  添加客户端库 3.  修改startUp.cs文件,增加services.AddSignalR();和endpoints.Map ...

  10. pycharm像vs那样进行代码折叠

    在visual studio中可以使用#region和#endregion来进行代码折叠,我尝试在pycharm中也可以使用相同的指令来折叠代码. 但是如果#endregion是在方法的最后面或者类的 ...