《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(4.12-加-6.2-加-7.2.5.2)Fused_Operations
4.12 Fused Operations 融合操作
融合操作通过“fusing”把两个简单的命令融合一起来支持一个更复杂的命令。协议规定这个特性是可选的;如果支持此特性,需要在Figure 247 Identity Controller数据结构的FUSES字段域中表明。



另外在Identity Namespace数据结构中,也有Atomic Operations特性(第6.4章节)配合。


在一个融合操作中,要求如下:
- 这两个命令必须作为一个原子单元按顺序执行。对于controller的表现来说,应该是在这两个命令中间不能执行其他操作。
- 在任何一个命令遇到错误时,这个融合操作就结束了。如果这个序列中的第一个命令失败,那么第二个命令应该被中止掉。如果这个序列中的第二个命令失败,那么第一个命令的completion状态是序列特定的。
- 如果用到了LBA,两个命令操作的LBA范围必须是相同的。如果两个LBA范围不一致,命令应该被中止,返回 Invalid Field in Command 状态。
- 这两个命令必须相互挨着依次插入到同一个SQ中。如果第一个命令位于SQ中的最后一个slot槽,那么第二个命令必须位于这个SQ的作为环绕部分的第一个slot槽。对于PCIe链路来说,SQ尾门铃指针更新必须表明两个命令的门铃更新作为一个整体都更新。
- 中止融合操作,主机必须分别的为每个命令提交中止命令。
- controller为每个命令都发送CQE。
具体某个命令是否归属于融合操作的一部分,它在命令 Dword 0 的融合操作(FUSE)域中表明,请参加Figure 104。这个FUSE域也表明每个命令在融合操作中是第一个命令还是第二个命令。如果FUSE域是一套非零值的集合,但controller不支持融合操作请求,那么controller应该中止命令,返回Invalid Field in Command状态。


6.2 Fused Operations
在下边Figure 349中定义了可用于NVM命令集的融合操作的命令序列。

6.2.1 比较和写
比较和写融合操作,比较Compare命令中指定逻辑块的内容与存储在指定LBA范围内数据。如果比较成功,那么使用Write命令中提供的数据更新这个LBA范围。如果Compare操作不成功,那么Write操作被中止,状态为Command Abort due to Failed Fused Command,并且这个LBA范围内的内容不被修改。如果Write操作不成功,Compare操作completion状态是unaffected(不受影响的)。
注意:在多主机环境中,为了确保Compare和Write是一个原子的,主机软件应该确保Compare和Write融合操作的操作大小不能大于ACWU/NACWU(参考6.4章节)并且Atomic Boundaries原子边界需要被重视(参考6.4.3章节)。当大于ACWU/NACWU或越过原子边界时,Controller可以中止Compare和Write融合操作,返回错误是Atomic Write Unit Exceeded。
6.3 命令顺序需求
对于所有不属于融合操作的命令,或写大小大于AWUN,每个命令的处理都是独立的实体而不参考其他命令,这里说的其他命令包括被提交到相同I/O SQ或被提交到不同I/O SQ种的命令。特别明确地,controller对检查Read或Write命令的LBA,保证命令之间的任何类型的排序,都是不负责的。例如,如果有个已提交的对LBA x的Read,也有一个已提交的对LBA x的Write,这些命令完成的先后顺序是没有保证的(或许读先完成或许写先完成)。如果这两个命令之间有顺序需求,主机软件或相关应用强制实施高于controller级别的排序。
7.2 命令提交和完成机制(参考性例子)
7.2.5 命令例子
7.2.5.2 执行一个融合操作【Executing a Fused Operation】
这个例子描述主机软件如何创建和执行一个融合命令,特别是对总共16KiB数据Compare和Write。在这个示例中,有两个命令被创建。第一个命令是Compare,作为CMD0提交,第二个命令是Write,作为CMD1提交。这个例子中,端到端保护未使能,每个逻辑块大小是4KiB。
为构建一个融合操作命令,主机软件利用适当的I/O SQ中接下来两个可用的相邻的命令位置。
Compare命令属性设置如下:
- CMD0.CDW0.OPC 赋值为05h,对应Compare命令opcode。
- CMD0.CDW0.FUSE 赋值为 01b ,表明这个命令是融合操作的第一个命令。
- CMD0.CDW0.CID 赋值一个空闲的命令ID标识。
- CMD0.NSID 赋值恰当的namespace ID。
- 如果元数据在另外的分开的buffer中,把buffer指定的位置赋值到CMD0.MPTR字段域中。
- 准备比较的数据的首页物理地址:
- 如果使用PRP,CMD0.PRP1赋值被比较数据的首页物理地址,CMD0.PRP2赋值PRP List的物理地址。PRP List展示在Figure 434中,PRP List有三项;
- 如果命令使用SGLs,CMD0.SGL1赋值恰当的SGL段描述符,取决于是否需要多个描述符。
- CMD0.CDW10.SLBA 赋值与比较相对应的第一个LBA。注意,这个域跨Dword 11。
- CMD0.CDW12.LR 赋值为0,表明controller应该运用所有可用的错误恢复手段来挽回用于比较的数据。
- CMD0.CDW12.FUA 赋值为0,表明数据可以从NVM subsystem中的任意位置读,包括从易失性缓存中。
- CMD0.CDW12.PRINFO 本示例不使能端到端数据保护,那么此字段赋值为0。
- CMD0.CDW12.NLB 赋值为3h,表示将与4个逻辑块进行比较,每个逻辑块的大小为4KiB。
- CMD0.CDW14 本示例不使能端到端数据保护,此字段赋值为0。
- CMD0.CDW15 本示例不使能端到端数据保护,此字段赋值为0。

Write命令属性设置如下:
- CMD1.CDW0.OPC 赋值为01h,对应Write命令opcode。
- CMD1.CDW0.FUSE 赋值为 10b ,表明这个命令是融合操作的第二个命令。
- CMD1.CDW0.CID 赋值一个空闲的命令ID标识。
- CMD1.NSID 赋值恰当的namespace ID。这个值必须与CMD0.NSID相同。
- 如果元数据在另外的分开的buffer中,把buffer指定的位置赋值到CMD1.MPTR字段域中。
- 准备要写的数据的首页物理地址:
- 如果使用PRP,CMD1.PRP1赋值被比较数据的首页物理地址,CMD1.PRP2赋值PRP List的物理地址,PRP List有三项;
- 如果命令使用SGLs,CMD1.SGL1赋值恰当的SGL段描述符,取决于是否需要多个描述符。
- CMD1.CDW10.SLBA 赋值与比较相对应的第一个LBA。注意,这个域跨Dword 11。这个值必须与CMD0.CDW10.SLBA相同。
- CMD1.CDW12.LR 赋值为0,表明controller应该运用所有可用的错误恢复手段来把数据写入到NVM。
- CMD1.CDW12.FUA 赋值为0,表明数据可以写入到NVM subsystem中的任意位置,包括写入易失性缓存中。
- CMD1.CDW12.PRINFO 本示例不使能端到端数据保护,那么此字段赋值为0。
- CMD1.CDW12.NLB 赋值为3h,表示将与4个逻辑块进行比较,每个逻辑块的大小为4KiB。这个值必须与CMD0.CDW12.NLB相同。
- CMD1.CDW14 本示例不使能端到端数据保护,此字段赋值为0。
- CMD1.CDW15 本示例不使能端到端数据保护,此字段赋值为0。
构建完这两个命令后,主机软件(PCIe链路情况)通过写恰当的I/O SQ门铃来向controller表明这两个命令已被提交的方式,提交命令去执行。注意,写门铃必须表明这两个命令一次性都被提交。
附言:
如果想了解命令个字段的表达意思,请参考下边这个链接。
https://www.cnblogs.com/JamesLi/p/11446796.html
《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(4.12-加-6.2-加-7.2.5.2)Fused_Operations的更多相关文章
- 2019/1/10 redis学习笔记(二)
本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...
- Flutter学习笔记(12)--列表组件
如需转载,请注明出处:Flutter学习笔记(12)--列表组件 在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源 ...
- JavaSE学习笔记(12)---线程
JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.23)-- Format NVM command
5.23 Format NVM command - NVM Command Set Specific Format NVM命令用于低级格式化NVM媒介.这个命令被host主机使用,来变更LBA数据大小 ...
- SpringBoot学习笔记(12):计划任务
SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...
- selenium学习笔记11——driver.get(url) 页面加载时间太长
在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...
随机推荐
- JavaScript-迭代器模式
迭代器模式 顺序访问一个集合 使用者无需知道集合内部结构(封装) jQuery 示例 <!DOCTYPE html> <html> <head> <meta ...
- springboot 后台框架平台 mybatis 集成代码生成器 shiro 权限 websocket
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- 面向对象编程(什么是对象)——java
一.什么是面向对象,什么是面向过 二.引入对象和类的概念 对象:是具体事物 如:小明 汽车 类: 是对对象的抽象(抽象 抽出象的部分) Person 先有具体的对象,然后抽象各个对象之间的部分,归纳出 ...
- 爬取豆瓣网图书TOP250的信息
爬取豆瓣网图书TOP250的信息,需要爬取的信息包括:书名.书本的链接.作者.出版社和出版时间.书本的价格.评分和评价,并把爬取到的数据存储到本地文件中. 参考网址:https://book.doub ...
- java设计模式学习笔记--接口隔离原则
接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...
- EPEL添加与删除
EPEL简介 EPEL的全称叫 Extra Packages for Enterprise Linux,由Fedora社区打造,如它的全称,这是一个为红帽系列及衍生发行版如CentOS.Fedora提 ...
- CF #618 div.2
序 闲来无事,打场CF,本人蒟蒻,考场A了前三道,第四有解答 正文 T1 Non-zero 是道水题.... 给你一个序列a.要求你输出最少的操作次数使这个序列的累和与累乘都不为0: 一次操作指给\( ...
- @RequestBody 和 @RequestParam(“test”) 的区别与联系
@RequestBody @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的):GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用 ...
- Python循环引用的解决方案
1.延迟导入:即将 from xxx import yyy 放到函数或类的内部,从而使其作用域变成局部的,但是这样可能会对性能有些影响: 2.将 from xxx import yyy 转换成 imp ...
- 剑指offer-面试题29-顺时针打印矩阵-矩阵
/* 题目: 输入一个矩阵,按照从外到内顺时针的顺序依次打印每一个数字. */ /* 思路: 1.将打印矩阵看作是打印一个个从外向内的环. 2.每一个环都有一个起始节点,起始节点的坐标*2小于行数和列 ...