Controller架构

  NVMe over Fabrics使用与NVMe基础规格说明书中定义相同的controller架构。这包括主机和controller之间使用SQ提交队列和CQ完成队列来执行命令。

1、 Identify Controller数据结构增强

  这一章节定义NVMe over Fabrics专用的Identify Controller字段。

            

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。

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、 初始化

  主机选择一个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分钟之内未完成,那么关联关系可能被拆掉。

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学习笔记六—Controller Architecture的更多相关文章

  1. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

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

  4. Typescript 学习笔记六:接口

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

  5. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  6. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  7. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  8. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  9. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  10. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

随机推荐

  1. python json.loads()、json.dumps()和json.dump()、json.load()区别

    json.loads().json.dumps()和json.dump().json.load()分别是两组不同用法 带s的用于数据类型的转换,不带s的用于操作文件. json.loads().jso ...

  2. [转帖]警惕Oracle数据库性能“隐形杀手”——Direct Path Read

    一. 简介 Oracle 的11g版本正式发布到今天已经10年有余,最新版本也已经到了20c,但是Direct Path Read(直接路径读)导致性能问题的案例仍时有发生,很多12c的用户还是经常遇 ...

  3. [转帖]perf学习-linux自带性能分析工具

    目前在做性能分析的事情,之前没怎么接触perf,找了几篇文章梳理了一下,按照问题的形式记录在这里. 方便自己查看.   什么是perf? linux性能调优工具,32内核以上自带的工具,软件性能分析. ...

  4. [转帖]Kafka可靠性之HW与Leader Epoch

    <深入理解Kafka:核心设计与实现原理>是基于2.0.0版本的书 在这本书中,终于看懂了笔者之前提过的几个问题 准备知识 1.leader里存着4个数据:leader_LEO.leade ...

  5. 【转帖】PyCharm---Django简单例子--基础1

    https://www.cnblogs.com/kllay/p/7286701.html 环境: python 2.7 Django 1.11.2    查看版本:python -m django - ...

  6. [转帖]Windows系统内置测试工具(winsat)

    WinSAT 是 Windows 系统评估工具(Windows System Assessment Tool)的缩写,是从 Windows Vista 开始便内置于系统之中的命令行工具,可对 Wind ...

  7. [转帖]将nginx.conf文件的内容拆分成多个

    nginx的如果有多个server模块都配置在同一个nginx.conf文件会显得比较臃肿,后续维护起来也会比较困难,所以可以将内容写入到多个配置文件中然后在nginx.conf文件中通过includ ...

  8. Specjvm2008的简单学习

    Specjvm2008的简单学习 摘要 前期整理过很多需要通过编译指定命令进行性能测试的工具 但是这种工具无法充分模式JAVA应用. 并且无法模拟不同jvm版本的性能情况. 早上去北京出差路上看到了 ...

  9. [转帖]jvm学习三-MAT内存分析工具的使用

    目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 ...

  10. 依据HTML标准再探Javascript事件循环及其与浏览器渲染的关系

    Javascript的一些基础概念 JavaScript执行引擎在宿主环境中是单线程的,这意味着在同一时间内只能执行一个任务.在Javascript运行期间,引擎会创建和维护相应的堆(heap)和栈( ...