《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture
4 Controller架构
NVMe over Fabrics使用与NVMe基础规格说明书中定义相同的controller架构。这包括主机和controller之间使用SQ提交队列和CQ完成队列来执行命令。
4.1 Identify Controller数据结构增强
这一章节定义NVMe over Fabrics专用的Identify Controller字段。
4.2 Controller模型
NVM subsystem可以支持动态的或静态的controller模型。同一个NVM subsystem中所有controller必须遵循相同的controller模型。Discovery Controller必须支持动态的controller模型。
在动态的controller模型中,controller是NVM subsystem按需分配的。这种模型,所有的为特定主机分配的controller在建立关联的时候都具有相同的状态,包括挂载的namespace和功能特性设置。对于建立关联之后的controller发生改变不能影响其他动态的controller。NVM subsystem使用动态controller模型的情况下,当主机使用Fabrics Connect命令建立关联时主机必须指定Controller ID为0xFFFF。
在静态的controller模型中,与特定主机建立关联时分配的controller,它们可能处于不同状态。NVM subsystem中的controller们通过Controller ID来辨别。【The state that persists across associations is any state that persists across a Controller Level Reset. 】。对于一个静态的controller模型,不同的controller可能对同一主机呈现不同的功能特性设置或namespace挂载。NVM subsystem可以分为具体的主机配特定的controller。
为主机们静态的controller分配期望它持久(以便主机能够期望反复多次的(例如主机重启之后)通过关联连接到同一个controller),但在controller没有被使用的任意时刻,为了执行某些特定原因(例如:controller资源回收,subsystem重新配置),NVM subsystem可以删除controller的主机配置。
返回的Discovery Log Entries中有controller ID值,指出这个NVM subsystem是支持动态的还是静态的controller模型。0xFFFF表示的controller ID值是一个特殊值,用于支持动态的controller模型的NVM subsystem来表明可能返回任意可用的controller。0xFFFE也是一个特殊的controller ID值,用于支持静态的controller模型的NVM subsystem来表明可能返回任意可用的controller。如果Discovery Log entries使用Controller ID值为0xFFFF那么这个NVM subsystem支持动态的controller模型。如果Discovery Log entries使用Controller ID值小于0xFFFF那么这个NVM subsystem支持静态的controller模型。Identify Controller数据结构也标示这个NVM subsystem是动态的还是静态的。
如果一个NVM subsystem是动态的,对于这个NVM subsystem,那么可能Discovery Log中许多Discovery Log Page entries(参考Figure 34)的Controller ID设置为0xFFFF被返回(例如,表示多个NVM subsystem端口)。如果NVM subsystem是静态的,那么Discovery Log中多个Discovery Log Page entries设置不同的Controller ID值被返回。如果一个静态的NVM subsystem的包含Controller ID为0xFFFE值的Discovery Log entries任何条目,主机都应该记下从Fabrics Connect命令返回的Controller ID,并且将来与此controller关联时再使用这个分配的Controller ID。
4.3 队列初始化和队列状态
当一个Connect命令成功完成,相应的Admin提交队列和Admin完成队列或者I/O提交队列和I/O完成队列就被创建了。如果主机发送一个Connect命令指定了队列的队列ID并且这个队列ID已经存在,那么返回Command Sequence Error状态值。
Connect应答中的Authentication Requirement(AUTHREQ)字段指示是否要求带内认证。如果AUTHREQ字段为0,刚创建的这个队列在Connect命令成功完成之后就准备好可以被使用了。如果AUTHREQ字段设置的非0值,创建的这个队列需要利用Authentication Send和Authentication Receive命令在NVMe带内认证被成功地执行之后才可以使用。
如果controller要求或正在进行NVMe带内认证,controller应该中止除了认证命令之外的所有其他命令,状态为Authentication Required。NVMe带内认证成功执行之后,controller应该中止所有的认证命令,状态为Command Sequence Error。
Admin队列是第一个被创建的,关联的controller是禁用状态(即,CC.EN初始为0)。禁用的controller必须中止除了Admin队列上Fabrics命令之外的所有命令,状态为Command Sequence Error。controller被使能之后,它应该接收除了Fabrics命令之外的所有支持的Admin命令。
如果关联的controller被禁用,创建好的I/O队列必须中止所有命令,状态为Command Sequence Error。
4.4 初始化
主机选择一个NVM subsystem来创建主机到controller的关联。主机首先与这个NVM subsystem建立一个NVMe Transport连接。然后主机与controller形成关联并用Fabrics Connect命令创建Admin队列。最后,主机配置controller并创建I/O队列。Figure 29是一个梯形图,描述了一个Admin队列或一个I/O队列的队列创建过程。
如下描述了建立关联之后controller初始化的步骤。对于测定功能能力或配置properties,主机分别使用Property Get和Property Set命令。
1、根据要求执行NVMe带内认证(参考第6.2章节);
2、主机测定controller功能能力;
3、主机配置controller的设置。具体的设置包括:
a、在CC.AMS中选择仲裁机制;
b、在CC.MPS中初始化内存页大小;
c、在CC.CSS中选择将被使用的I/O命令集。
4、通过设置CC.EN为1使能controller;
5、主机需要等待controller直到表明准备好处理命令,当CSTS.RDY为1表明controller准备好可以处理命令了;
6、主机应该通过发送Identify命令来确定controller的配置,具体说明Controller数据结构。然后主机应该通过对每一个namespace发送Identify命令来确定每一个namespace的配置,具体说明Namespace数据结构;
7、主机应该使用Set Feature命令带着队列特性标识数来确定支持的I/O提交队列和I/O完成队列数量。
8、如果主机期望可选的异步通知事件,主机应该下发Set Feature命令指定此事件使能。如果主机需要异步通知事件,主机应该提交一个恰当的Asynchronous Event Request命令数。这一步骤可以在controller就绪之后(即,CSTS.RDY为1)的任意点都可以做。
建立关联之后如果第4步(设置CC.EN为1)在2分钟之内未完成,那么关联关系可能被拆掉。
4.5 关闭
关闭controller,主机应该用Property Set命令设置Shutdown Notification(CC.SHN)字段为01b来表明是一个正常的关闭操作。在主机指定关闭之后,主机要么在NVMe Transport级别断开连接要么可以选择对CSTS.SHST进行轮询来判断关闭何时完成(controller不应该在NVMe Transport级别发起一个断开连接)。不论主机是否中止关闭之前的未处理的命令都是一种可选的实现。
CC.EN字段不是用于关闭controller的(它是用于Controller Reset)。作为关闭的一部分,CC.EN字段会被清零。关闭之后如下会被发起:
- 关闭之后CC.EN字段被清零;
- 关闭之后CSTS.RDY字段被清零,
只有Fabrics命令可以被controller处理,Keep Alive定时器(如果支持的话)被禁用。
CC.EN转换成0之后(由于关闭或重置),主机和controller之间的关联必须被保持至少2分钟。超过这个时间之后,如果controller没有被重新使能关联可以被拆除。
《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture的更多相关文章
- 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(3)-- 命令
3 命令 Fabrics命令用于创建队列和初始化controller.Fabrics命令的Opcode字段填写0x7F.无论controller是否处于使能状态(CC.EN)Fabrics命令都会被处 ...
- 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(1)
1 引言(入门介绍) NVMe版本1.2.1和之前的版本为主机软件与非易失存储系统通过PCIe通信定义了寄存器级接口.本规格说明书定义了对NVMe的扩展,启用通过其他网络互联上的操作(NVMe ove ...
- 2018.07.23 codeforces 438D. The Child and Sequence(线段树)
传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presen ...
- 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)
传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...
- 2018.07.23[PA2015]Siano(线段树)
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...
- 2018.07.23 hdu5828 Rikka with Sequence(线段树)
传送门 这道题维护区间加,区间开根,区间求和. 线段树常规操作. 首先回忆两道简单得多的线段树. 第一个:区间覆盖,区间加,区间求和. 第二个:区间开根,区间求和. 这两个是名副其实的常规操作. 但这 ...
- 2018.07.23 洛谷P4513 小白逛公园(线段树)
传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...
- NVMe over Fabrics 协议Discovery服务交互过程跟踪
Discovery服务过程跟踪 对于NVMe over Fabrics的subsystem,有两种类型:Discovery子系统和NVM子系统.这里介绍与Discovery子系统相关的交互内容(即:在 ...
- NVMe over Fabrics:概念、应用和实现
对于大部分人来说,NVMe over Fabrics(简称NVMf)还是个新东西,因为其第一个正式版本的协议在今年6月份才发布.但是这并不影响人们对NVMf的关注,因为这项依托于NVMe的技术很可能继 ...
随机推荐
- CF #622 div.2
序 ~ieowjf~~ 真的只有老邱在支持我吗(雾 #622 T1 此题做法显然,但是,不知为何,就是会评测机有小问题...无语 上 SingerCoder 的码,不知为何,我的码风总是毒瘤 #inc ...
- 关于GC(垃圾回收)
当我用new创建一个对象时,当可分配的内存不足GC就会去回收未使用的对象,但是GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能.下面的建议可以避免GC频繁操作 ...
- Android实战项目——家庭记账本(五)
今天博客写的有点晚(好像算是昨天的了),有一点小bug刚刚改完.今天完成的任务有: 1.统计页的布局和功能 2.主页碎片的图表功能 实现效果如下: 其中,统计 ...
- ie8兼容rgba写法
ie使用filter解决半透明兼容性问题 filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#19ffffff,endCo ...
- MVC5+EF6入门完整教程7:排序过滤分页
https://www.cnblogs.com/miro/p/4134241.html 前置准备 – 应用之前样式,增加测试数据 界面样式修改前: 下面对Views --> Account -- ...
- TCP与UDP的一些心得
1:CC攻击是正常的业务逻辑,大并发让你处理不过来,处理XP SP2,以上的系统都封了RAW格式协议封包自定义,除了基于应用层改协议,之外都是模拟或请求来测试传输层2:UDP不会粘包,不会少包,除非缓 ...
- pyjsonrpc的使用
pyjsonrpc的使用 客户端 JsonRpcClient.py #!usr/bin/env python2.7 # -*- coding: utf-8 -*- import ssl import ...
- 使用vegrant安装centos7
1.首先去安装需要先安装好 Vagrant 和 VirtualBox. 安装好需要重启电脑. 可能网速会很慢,建议复制链接到迅雷下载,或者国内随便找个下载也可以. 2.在电脑创建vagrant_vm目 ...
- hdu 2187 悼念512汶川大地震遇难同胞——老人是真饿了(贪心)
新人题:n2的排序就可以过 #include <stdio.h> #include <stdlib.h> int main() { int c,n,i,j,o; ],b[],m ...
- nohup npm start &启动之后关闭终端程序没有后台运行
感谢:https://blog.csdn.net/nsj820/article/details/5862231 “在当shell中提示了nohup成功后,还需要按终端上键盘任意键退回到shell输入命 ...