【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】
Figure 19 展示了一个 NVM Subsystem,它支持Single Root I/O Virtualization (SR-IOV),并具有一个 Physical Function 和四个Virtual Functions。实现 NVMe over PCIe 的 NVM Express 控制器与每个Function相关联,每个控制器具有一个私有命名空间并可以访问所有控制器共享的命名空间,标记为 NS F。此示例中控制器的行为与此示例中的其他示例相似部分。
提供的示例旨在说明概念,并非旨在列举所有可能的配置。例如,一个 NVM Subsystem 可能包含多个 PCI Express port,每个 port 都支持 SR-IOV。
虚拟化环境可以使用一个具有多个控制器的 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:
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 的控制器资源类型的控制器资源分配模型。
对于支持的每种控制器资源类型,Primary Controller Capabilities Structure 定义了:
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 应支持以下内容:
在同时支持 Virtualization Enhancements capability 和 SR-IOV 的NVM子系统中,所有属于 SR-IOV PF 的控制器应是 primary controllers,所有属于 SR-IOV VF的控制器应是其相关 PF 的 secondary controllers。
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 命令发现。
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 应处于下列状态之一:
主机可以使用 Virtualization Management 命令请求转换到Online或Offline状态。当 secondary controller 从 Online 状态转换到 Offline 状态时,所有的 Flexible Resources 将从 secondary controller 中移除。
为确保主机准确检测secondary controller的capabilities,主机应完成以下程序,使 secondary controller Online:
当 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 状态。
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。应该实现如下标准控制器寄存器capability:
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 的 Primary Controller Capabilities Structure 返回给 host。
CMIC 字段, bit 2如果设置为'1',那么控制器与SR-IOV Virtual Function相关。如果清除为'0',则控制器与 PCI Function 或 Fabrics 连接相关联。
将向主机返回一个 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 状态。
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。
Bits | Description |
---|---|
31:16 | Reserved |
15:00 | Number of Controller Resources (NR): 这个字段表示要分配或指派的控制器资源的数量。 |
与 Virtualization management 命令相关的具体状态值在Figure 373中定义。
不管是PF,还是VF,都应实现如下 BAR space,但实现的内容有所区别,有些是在PCIe有规定的,有些是 Vendor Specific 的
如果觉得本文对您有用,为什么不点赞 + 关注 + 收藏呢
如果觉得本文对您有用,为什么不点赞 + 关注 + 收藏呢
如果觉得本文对您有用,为什么不点赞 + 关注 + 收藏呢