《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字段。

《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture

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队列的队列创建过程。

《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(4)-- Controller Architecture

如下描述了建立关联之后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没有被重新使能关联可以被拆除。

 

上一篇:SPDK问题排查之二


下一篇:安装 Windows 系统在 NVMe 规范的 M.2 接口的固态硬盘(SSD)上