View on GitHub

Fa Huang

huangfa-blog

nvme 协议1.3版学习笔记:


Admin command(10个必选)


nvme命令执行流程 (page 201)

  1. host提交命令到SQ
  2. host写doorbell
  3. controller fetch 一批command
  4. controller 乱序执行command
  5. controller 把执行结果写入CQ
  6. controller 产生中断通知host
  7. host 处理CQE,注意这里可能有多个CQE需要处理,所以代码级别是有一个while循环处理的,一直处理到发现phase不满足的CQE结束
  8. 最后一步,host 写CQ 的doorbell,通知controller。注意第七步可能处理了多个CQE,而这里只需要写一次doorbell。

提交Command

  1. host 构造一个command:CDW0.OPC, CDW0.FUSE, CDW0.CID, CDW1.NSID, MPTR, PRP, CDW10 - CDW15的命令差异字段设置。
  2. host写SQ的doorbell

host处理CQ

  1. host 从对应CQ中读出一个CQE
  2. host 解析CQE,根据DW2.SQID, DW3.CID可以得到SQ id和command id。
  3. 解析DW3.SF可以得到command的执行结果。
  4. host 更新CQ的游标,写对应doorbell。清理中断。
  5. 如果command执行失败,这里做recover操作。

nvme设备的初始化流程

  1. 设置PCI 寄存器,bar0,bar1中的那一堆
  2. host等待设备之前的可能reset操作,等待CSTS.RDY 变0
  3. 配置admin queue相关寄存器AQA, ASQ, ACQ
  4. controller setting:CC.AMS CC.MPS CC.CSS
  5. 使能设备 CC.EN 置1
  6. host等待设备ready,CSTS.RDY变1
  7. controller identify,然后对每一个namespace进行identify
  8. 使用set feature命令配置IO SQ&CQ个数以及完成中断寄存器的配置
  9. host准备好IO CQ的内存资源,使用create I/O completion queue的命令创建好CQ
  10. host准备好IO SQ的内存资源,使用create I/O submission queue的命令创建SQ
  11. 异步事件通知机制的配置

normal shutdown流程

  1. 确保host不再下发任何 IO COMMAND,并且允许任何正在处理中的command完成
  2. host删除所有的IO SQ,成功的删除会将所有等待执行的command abort掉
  3. host删除所有的IO CQ
  4. host设置CC.SHN域为01b,当controller更新CSTS.SHST为10b时标志shutdown流程完成了

keep alive命令


读写命令


SR-IOV

SR-IOV 中的两种新功能类型是:

  1. 物理功能 (Physical Function, PF) 用于支持 SR-IOV 功能的 PCI 功能,如 SR-IOV 规范中定义。PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样进行发现、管理和处理。PF 拥有完全配置资源,可以用于配置或控制 PCIe 设备。

  2. 虚拟功能 (Virtual Function, VF) 与物理功能关联的一种功能。VF 是一种轻量级 PCIe 功能,可以与物理功能以及与同一物理功能关联的其他 VF 共享一个或多个物理资源。VF 仅允许拥有用于其自身行为的配置资源。

每个 SR-IOV 设备都可有一个物理功能 (Physical Function, PF),并且每个 PF 最多可有 64,000 个与其关联的虚拟功能 (Virtual Function, VF)。PF 可以通过寄存器创建 VF,这些寄存器设计有专用于此目的的属性。

一旦在 PF 中启用了 SR-IOV,就可以通过 PF 的总线、设备和功能编号(路由 ID)访问各个 VF 的 PCI 配置空间。每个 VF 都具有一个 PCI 内存空间,用于映射其寄存器集。VF 设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的 PCI 设备。创建 VF 后,可以直接将其指定给 IO 来宾域或各个应用程序(如裸机平台上的 Oracle Solaris Zones)。此功能使得虚拟功能可以共享物理设备,并在没有 CPU 和虚拟机管理程序软件开销的情况下执行 I/O。

SR-IOV 的优点

SR-IOV 标准允许在 IO 来宾域之间高效共享 PCIe 设备。SR-IOV 设备可以具有数百个与某个物理功能 (Physical Function, PF) 关联的虚拟功能 (Virtual Function, VF)。VF 的创建可由 PF 通过设计用来开启 SR-IOV 功能的寄存器以动态方式进行控制。缺省情况下,SR-IOV 功能处于禁用状态,PF 充当传统 PCIe 设备。

具有 SR-IOV 功能的设备可以利用以下优点: