【NVMe2.0b 15】NVMe SR-IOV

NVMe SR-IOV

  • PCIe SR-IOV 系列导航
  • 基于 PCIe 的 NVM transport 实施结构
  • 关键词定义
  • 支持 SR-IOV 的 NVM Subsystem 结构
  • Virtualization Enhancements
    • VQ Resource 定义
    • VI Resource 定义
    • Secondary Controller 状态与资源配置
    • Single Root I/O Virtualization and Sharing (SR-IOV)
  • 支持 Virtualization Management 的 Controller 类型
  • 支持 SR-IOV 的 Controller register 配置
    • Primary Controller
      • Identify Controller data structure(CNS 01h)
      • Primary Controller Capabilities data structure (CNS 14h)
    • Secondary Controller
      • Identify Controller data structure(CNS 01h)
      • Identify Sencondary Controller List(CNS 15h)
  • Virtualization Management
    • Command Completion
  • PCIe Type 0/1 Common Configuration Space
  • 参考文档
  • 写在最后

PCIe SR-IOV 系列导航

【PCIe 5.0 - 100】SR-IOV【1】
【PCIe 5.0 - 101】SR-IOV【2】
【PCIe 5.0 - 102】SR-IOV【3】
【PCIe 5.0 - 103】SR-IOV 【4】

基于 PCIe 的 NVM transport 实施结构

【NVMe2.0b 15】NVMe SR-IOV_第1张图片

关键词定义

secondary controller/辅助控制器
一种 NVM Express 控制器,它依赖于 NVM 子系统中的主控制器来管理某些控制器资源。
支持 NVM Express 接口并从主控制器接收资源的 PCI Express SR-IOV Virtual Function 是辅助控制器的示例。

primary controller/主控制器
支持 Virtualization Management 命令的 NVM Express 控制器。一个 NVM 子系统可能包含多个主控制器。NVM 子系统中的辅助控制器依赖于主控制器进行动态资源管理。

支持 NVM Express 接口和 Virtualization Enhancements capability 的 PCI Express SR-IOV Physical Function 是主控制器的一个示例。

特权操作
特权操作是影响或可能影响超出控制器和 attach 上的命名空间的状态的操作(如,命令、寄存器写入)。

支持 SR-IOV 的 NVM Subsystem 结构

Figure 19 展示了一个 NVM Subsystem,它支持Single Root I/O Virtualization (SR-IOV),并具有一个 Physical Function 和四个Virtual Functions。实现 NVMe over PCIe 的 NVM Express 控制器与每个Function相关联,每个控制器具有一个私有命名空间并可以访问所有控制器共享的命名空间,标记为 NS F。此示例中控制器的行为与此示例中的其他示例相似部分。

Figure 19: PCI Express Device Supporting Single Root I/O Virtualization (SR-IOV)

【NVMe2.0b 15】NVMe SR-IOV_第2张图片
提供的示例旨在说明概念,并非旨在列举所有可能的配置。例如,一个 NVM Subsystem 可能包含多个 PCI Express port,每个 port 都支持 SR-IOV。

Virtualization Enhancements

虚拟化环境可以使用一个具有多个控制器的 NVM subsystem,为 virtual 或 physical 主机提供直接I/O访问。NVM subsystem 由 primary controller(s) 和 secondary controller(s) 组成,其中 secondary controller(s) 依赖于 primary controller(s) 的动态分配资源。主机可以向 primary controller 发出 Identify 命令,指定 Secondary Controller List,以列出与该 primary controller 相关的 secondary controller(s)。所有 secondary controllers 应与与之相关的 primary controller 属于同一 Domain。

可以使用向 primary controller 发出 Virtualization Management 命令从控制器中分配或删除controller resources。有以下类型的 controller resources:

  • Virtual Queue Resource(VQ Resource):一种控制器资源,管理一个 Submission Queue (SQ)和一个Completion Queue(CQ);
  • Virtual Interrupt Resource(VI Resource):一种控制器资源,管理一个interrupt vector。

Flexible Resources 是控制器资源,它可以分配给 primary controller 或其 secondary controllers 之一。Virtualization Management 命令用于在 primary controller 和它的一个 secondary controller 之间配置 Flexible Resources。primary controller 对 Flexible Resources 的分配可以使用 Virtualization Management 命令进行修改,该修改在任何 Controller Level Reset(即CC.EN从'1'转换到'0')之后生效。secondary controllers 只支持在offline状态下分配或删除 Flexible Resources。

Private Resources 是永久分配给 primary controller 或 secondary controllers 的控制器资源。这些资源不被 Virtualization Management 命令所支持。

primary controller 被允许对特定的控制器资源类型拥有 Private Resources 和 Flexible Resources 的混合。如果有混合,那么 Private Resources 占据从0开始的 resource identifiers 的较低连续范围。

secondary controller 应拥有特定资源类型的所有 Private Resources 或所有 Flexible Resources。如果如 Primary Controller Capabilities Structure 的 Controller Resource Types 字段所示,支持特定的控制器资源类型,那么所有 secondary controllers 应将该控制器资源类型分配为 Flexible Resources。

Figure 478 显示了可分配为 Flexible Resources 的控制器资源类型的控制器资源分配模型。

Figure 478: Controller Resource Allocation

【NVMe2.0b 15】NVMe SR-IOV_第3张图片

对于支持的每种控制器资源类型,Primary Controller Capabilities Structure 定义了:

  • Flexible Resources 的总数。
  • primary controller 的 Private Resources 的总数。
  • 使用 Virtualization Management 命令可以分配给 secondary controller 的最大数量的 Flexible Resources;和
  • 对 primary controller 的资源分配。

Primary 和 secondary controllers 可以实现 NVMe 规范的所有功能,除非命令被定义为仅由 primary controller 支持。建议只有 primary controller 支持特权操作,这样使用 secondary controllers 的不受信任的主机就不会影响整个 NVM subsystem 的状态。

由 Identify 命令返回的 Secondary Controller List structure 用于确定 secondary controllers 的拓扑结构和分配的资源。secondary controllers 应处于 Offline 状态来配置资源。Virtualization Management 命令用于将 secondary controllers 在 Online 状态和 Offline 状态之间转换。

为了支持 Virtualization Enhancements capability,NVM subsystem 应支持以下内容:

  • 至少一个 primary controller,每个 primary controller 都支持:
    o至少一个 secondary controller。
    o一个未分配的 Flexible Resources pool,支持分配给 primary controller 和动态分配给其相关的secondary controllers
    o至少两个 Private Resource queue 对
    o在 Identify Controller data structure 的 Optional Admin Command Support (OACS) 字段中指出对 Virtualization Management 命令的支持
    oVirtualization Management 命令
    oPrimary Controller Capabilities Structure(Identify CNS 14h)
    oSecondary Controller List(Identify CNS 15h);以及
    oNamespace Management capability
  • 至少一个secondary controller;
  • Flexible Resources, 每个 Flexible Resource 都支持:
    o准确地由一个 primary controller 进行分配和移除;以及
    o每次分配给不超过一个控制器。

在同时支持 Virtualization Enhancements capability 和 SR-IOV 的NVM子系统中,所有属于 SR-IOV PF 的控制器应是 primary controllers,所有属于 SR-IOV VF的控制器应是其相关 PF 的 secondary controllers。

VQ Resource 定义

Virtual Queue Resource(VQ Resource) 是一种控制器资源,管理一个CQ和一个SQ。对于分配给控制器的 VQ Resource,其 resource identifier 等同于其 Queue Identifier。

Primary Controller Capabilities Structure的Controller Resource Types字段表明是否支持VQ Resource。如果不支持VQ Resource,primary controller 及其相关的 secondary controllers 的所有队列都是 Private Resources。本节的其余部分假设支持VQ Resource。

secondary controller 使用 Virtualization Management 命令分配 VQ Resources。分配的 VQ Resources 数量可在相关 secondary controller 的 Secondary Controller List entry 中发现。分配的 VQ Resource 数量也可以通过使用 Number of Queues Feature identifier 的 Get Features 命令发现。

如果一个 secondary controllers 没有分配 VQ Resource,那么该控制器就保持在 Offline 状态。在Admin Queue 和一个或多个 I/O Queues 的 VQ Resource 被分配给该控制器之前,secondary controllers 不能过渡到 Online 状态(即,可分配的 VQ Resource 的最小数量是两个)。

支持 VQ Resource 的 primary controller 应至少有两个队列对是 Private Resources,以确保 primary controller 在任何时候都至少有一个 Admin Queue对和一个 I/O Queues对。primary controller 可以使用Virtualization Management 命令的 Primary Controller Flexible Allocation 操作来分配 VQ Resource。所分配的 VQ Resource 在 Controller Level Reset 后生效,并在 power cycles 和 resets 中持续存在。当前分配的 VQ Resource 的数量可以在 Primary Controller Capabilities Structure 中发现。当前分配的 VQ Resource 数量也可以通过使用 Number of Queues Feature identifier 的 Get Features 命令发现。

VI Resource 定义

Virtual Interrupt Resource(VI Resource)是一种控制器资源,它管理一个中断向量,如 MSI-X 向量。对于分配给一个控制器的 VI Resource,其 resource identifier 相当于其中断向量的编号。

Primary Controller Capabilities Structure 的 Controller Resource Types 字段表明是否支持 VI Resource。如果不支持 VI Resource,一个 primary controller 及其相关的 secondary controllers 的所有中断都是 Private Resources。本节的其余部分假设支持 VI Resource。

secondary controller 使用 Virtualization Management 命令分配 VI Resource。分配的 VI Resource的数量可以在相关的 secondary controller 的 Secondary Controller List 中发现。

虽然 primary controller 和/或其相关的 secondary controllers 可以同时支持多种类型的中断向量(例如,MSI和MSI-X),但所有控制器的 VI Resource 应包含相同类型的中断向量的中断资源。在这个版本中,MSI-X是唯一支持的 VI Resource类型。

对于支持具有 MSI-X 向量的 VI Resource 的 secondary controllers,如果至少有一个 VI Resource 分配给该控制器,MSIXCAP.MXC.TS 表示分配给该控制器的 VI Resource 数量。由于MSIXCAP.MXC.TS 是只读的,该值只能在 secondary controllers 处于 Offline 状态时更新。secondary controller 上新分配的 VI Resource 的 MSI-X Table Entries 应重置为默认值。

如果支持 VI Resource 的 secondary controllers 没有分配 VI Resource,那么该控制器仍处于 Offline 状态。在 Interrupt vector 0 的 VI Resource 被分配给该控制器之前,secondary controllers 不能过渡到Online 状态。对于支持具有MSI-X向量的 VI Resource 的 secondary controllers,如果没有为该控制器分配 VI Resource,那么MSIXCAP.MXC.TS 是 reserved。

支持 VI Resource 的 primary controller 应至少有一个中断是 Private Resource。Interrupt vector 0 总是分配给 primary controller。primary controller 可以使用 Virtualization Management 命令的 Primary Controller Flexible Allocation 来分配 VI Resource。所分配的 VI Resource 在 Controller Level Reset 后生效,并且在不同的 power cycles 和 reset 中都是持久的。当前分配的 VI Resource 的数量可以在 Primary Controller Capabilities Structure 中发现。对于支持具有MSI-X向量的 VI Resource 的 primary controller,MSIXCAP.MXC.TS 表示 MSI-X Table 的大小等于 Private Resources 的总数和当前在 Controller Level Reset 分配的 Flexible Resources。

当创建一个 I/O CQ 时,控制器支持将该 I/O CQ 映射到任何有效的中断向量,无论它们是否具有相同的 resource identifier,只要 I/O CQ 和中断向量 attach 到同一个控制器。

Secondary Controller 状态与资源配置

secondary controller 应处于下列状态之一:

  • Online: secondary controller 可能正在被主机使用。所需的资源已被分配。secondary controller 可能在此状态下被enable(CC.EN可能被设置为’1’,然后CSTS.RDY可能转换为’1’);或者
  • Offline:不得由主机使用。CSTS.CFS应被设置为’1’。除CSTS以外的 controller 寄存器在此状态下未被定义。

主机可以使用 Virtualization Management 命令请求转换到Online或Offline状态。当 secondary controller 从 Online 状态转换到 Offline 状态时,所有的 Flexible Resources 将从 secondary controller 中移除。

为确保主机准确检测secondary controller的capabilities,主机应完成以下程序,使 secondary controller Online:

  1. 使用 Virtualization Management 命令,将 secondary controller 设置为 Offline 状态。
  2. 使用 Virtualization Management 命令来分配 VQ resources 和 VI resources。
  3. 执行 Controller Level Reset。如果 secondary controller 是 VF,那么这应该是 VF Function Level Reset;以及
  4. 使用 Virtualization Management 命令将 secondary controller 设置为 Online 状态。
    如果支持 VI Resources,那么按照这个过程可以确保 MSIXCAP.MXC.TS 所指示的 MSI-X Table 的大小被更新,以反映在转换到 Online 状态之前适当数量的 VI Resources。

当 CC.EN 和 CSTS.RDY 都被设置为 "1 "时,primary controller 或 secondary controller 被 enable。一个 secondary controller 只有在 Online 状态下才能被enable。如果与 secondary controller 相关的primary controller 被 disable 或经历了 Controller Level Reset,那么 secondary controller 应隐含地转换至 Offline 状态。当与 secondary controller 相关的 primary controller 发生 Shutdown时,secondary controller 应转换到 Offline 状态。

只有当处于 Offline 状态时,才应将资源分配给一个 secondary controller。如果最小数量的资源没有分配给 secondary controller,那么对该 secondary controller 来说,转换到 Online 状态的请求将失败。对于支持 SR-IOV 的实施方案,如果 VF Enable 被清除为 "0",或者 NumVFs 指定的值没有enable相关的 secondary controller,那么 secondary controller 应隐含地转换到 Offline 状态。

Single Root I/O Virtualization and Sharing (SR-IOV)

PCI-SIG® Single Root I/O Virtualization and Sharing Specification(SR-IOV)定义了PCI Express的扩展,允许多个系统镜像(SI),如在管理程序上运行的虚拟机,共享PCI硬件资源。SR-IOV的主要好处是,它消除了管理程序参与I/O操作,这可能是限制某些虚拟化环境中存储性能的一个重要因素,并允许SI直接访问PCI硬件资源。

Physical Function(PF)是一个支持SR-IOV Capability的PCI Express Function,这反过来又允许该PF支持一个或多个依赖的Virtual Functions(VF)。这些PF和VF可以支持NVM Express控制器,这些控制器共享一个具有 multi-path I/O and namespace sharing capabilities 的底层NVM subsystem。

具有NVM Express Class Code 的 SR-IOV Virtual Functions(VFs)应实现完全兼容的 NVM Express 控制器。这确保了为非虚拟化环境开发的相同的主机软件能够在SI内不加修改地运行。

对于不支持或不需要SR-IOV的主机,作为PF的控制器应支持作为一个独立的控制器运行。

对于一个PF的控制器,对 SR-IOV Capability 寄存器 VF BAR0、VF BAR1、VF BAR2、VF BAR4和VF BAR5 的要求分别与PCI寄存器 BAR0、BAR1、BAR4 和 BAR5 的要求相同。对于属于PF的控制器,SR-IOV Capability 寄存器 VF BAR2 不应支持Index/Data Pair。请参考 NVMe over PCIe Transport Specification 的PCI Header部分。 为了适应 SR-IOV 地址范围隔离的要求,VF BAR2 和 VF BAR3 可以支持64位预留 memory register space,该空间应仅用于 VF 的 MSI-X Table 和 MSI-X PBAs。MSI-X Table BIR='2' 和 MSI-X PBA BIR='2' 对属于 V F的控制器有效。请参考 NVMe over PCIe Transport Specification 的MSI-X Capability部分。 虽然只有在 SR-IOV Control.VF MSE 被设为'1'时,才可以访问作为 VF 的控制器的寄存器,但将 VF MSE 从'1'清为'0'不会导致该控制器的 reset。在这种情况下,controller 寄存器被隐藏,但它们的值不会被 reset。

支持 Virtualization Management 的 Controller 类型

  • I/O Controller
  • Administrative Controller

支持 SR-IOV 的 Controller register 配置

Primary Controller

应该实现如下标准控制器寄存器capability:

Figure 35: Property Definition

【NVMe2.0b 15】NVMe SR-IOV_第4张图片
【NVMe2.0b 15】NVMe SR-IOV_第5张图片

Identify Controller data structure(CNS 01h)

CMIC 字段, bit 2如果设置为'1',那么控制器与SR-IOV Virtual Function相关。如果清除为'0',则控制器与 PCI Function 或 Fabrics 连接相关联。

OACS 字段,Bit 7如果设置为'1',则控制器支持 Virtualization Management command。如果清除为'0',则说明控制器不支持 Virtualization Management command。

Primary Controller Capabilities data structure (CNS 14h)

用于将指定的 primary controller 的 Primary Controller Capabilities Structure 返回给 host。

Figure 281: Identify – Primary Controller Capabilities Structure

【NVMe2.0b 15】NVMe SR-IOV_第6张图片

【NVMe2.0b 15】NVMe SR-IOV_第7张图片

Secondary Controller

Identify Controller data structure(CNS 01h)

CMIC 字段, bit 2如果设置为'1',那么控制器与SR-IOV Virtual Function相关。如果清除为'0',则控制器与 PCI Function 或 Fabrics 连接相关联。

Identify Sencondary Controller List(CNS 15h)

将向主机返回一个 Secondary Controller List,该列表最多包含 127 个与处理此命 令的 primary controller 相关的 secondary controllers。该列表包含大于或等于 Controller Identifier (CDW10.CNTID)字段中指定值的 controller identifiers 条目。

所有 secondary controllers 都被展示,包括那些由于 SR-IOV configuration 设置而处于 Offline 状态 的控制器(例如,VF Enable 被清为'0'或 NumVFs 指定了一个没有 enable 的相关 secondary controller 的值)。

Figure 283 指出了一个 Sencondary Controller 资源分配状况和 enable 状态。

Figure 283: Secondary Controller Entry

【NVMe2.0b 15】NVMe SR-IOV_第8张图片

Virtualization Management

Virtualization Management 命令由支持 Virtualization Enhancements capability 的 primary controllers 支持。该命令用于以下场景: - 修改 primary controller 的 Flexible Resource 分配。 - 为 secondary controllers 分配 Flexible Resources;以及 - 设置secondary controllers 的 Online和 Offline 状态。

Virtualization Management 命令使用 Command Dword 10 和 Command Dword 11。所有其他命令的特定字段都 reserved。

如果请求的操作指定了一个控制器资源的范围,且该资源:

   a)不存在;
   b)是一个 Private Resource(例如,在不支持 VQ resources 时请求 VQ resources,在不支持 VI resources 时请求 VI resources);或
   c)目前正在使用(例如,number of Controller Resources(NR)的数量大于剩余的可用 flexible resources 的数量)。

则该命令被中止,状态码为 Invalid Resource Identifier。

Figure 371: Virtualization Management – Command Dword 10

【NVMe2.0b 15】NVMe SR-IOV_第9张图片

【NVMe2.0b 15】NVMe SR-IOV_第10张图片

Figure 372: Virtualization Management – Command Dword 11
Bits Description
31:16 Reserved
15:00 Number of Controller Resources (NR): 这个字段表示要分配或指派的控制器资源的数量。

Command Completion

与 Virtualization management 命令相关的具体状态值在Figure 373中定义。

Figure 373: Virtualization Management – Command Specific Status Values

【NVMe2.0b 15】NVMe SR-IOV_第11张图片

PCIe Type 0/1 Common Configuration Space

不管是PF,还是VF,都应实现如下 BAR space,但实现的内容有所区别,有些是在PCIe有规定的,有些是 Vendor Specific 的

Figure 10: PCI Express Type 0/1 Common Configuration Space

【NVMe2.0b 15】NVMe SR-IOV_第12张图片

【NVMe2.0b 15】NVMe SR-IOV_第13张图片

参考文档

  • NVM Express Base Specification 2.0b
  • PCI Single Root I/O Virtualization and Sharing Specification, revision 1.1
  • PCI Express® Base Specification, Revision 4.0
  • NVM Express NVMe over PCIe Transport Specification, Revision 1.0

写在最后

如果觉得本文对您有用,为什么不点赞 + 关注 + 收藏呢
如果觉得本文对您有用,为什么不点赞 + 关注 + 收藏呢
如果觉得本文对您有用,为什么不点赞 + 关注 + 收藏呢

你可能感兴趣的:(#,NVMe,NVMe,PCIe,硬件工程)