ice devlink 支持¶
本文档介绍了 ice
设备驱动程序实现的 devlink 功能。
参数¶
名称 |
模式 |
注释 |
|
runtime |
与 |
|
runtime |
与 |
|
permanent |
ice 硬件对 Tx 使用分层调度,调度树中具有固定数量的层。每一层都是决策点。根节点表示端口,而所有叶节点表示队列。这种配置 Tx 调度器的方式允许诸如 DCB 或 devlink-rate(如下所述)之类的功能来配置给予任何给定队列或队列组多少带宽,从而实现细粒度控制,因为可以在树的任何给定层配置调度参数。 默认的 9 层树拓扑被认为最适合大多数工作负载,因为它提供了性能和可配置性的最佳比率。但是,对于某些特定情况,可能不需要此 9 层拓扑。一个例子是将流量发送到不是 8 的倍数的队列。由于在 9 层拓扑中最大基数限制为 8,因此第 9 个队列与其余队列具有不同的父级,并且被给予更多的带宽信用。当系统向 9 个队列发送流量时,这会导致问题 tx_queue_0_packets: 24163396
tx_queue_1_packets: 24164623
tx_queue_2_packets: 24163188
tx_queue_3_packets: 24163701
tx_queue_4_packets: 24163683
tx_queue_5_packets: 24164668
tx_queue_6_packets: 23327200
tx_queue_7_packets: 24163853
tx_queue_8_packets: 91101417 < 从第 9 个队列发送的流量过多
为了满足此需求,您可以切换到 5 层拓扑,这将最大拓扑基数更改为 512。通过此增强功能,性能特性是相同的,因为所有队列都可以分配给树中的同一父级。此解决方案的明显缺点是树的配置深度较低。 使用带有 devlink 命令的 您必须执行 PCI 插槽电源循环,以使所选拓扑生效。 要验证是否已设置该值:$ devlink dev param show pci/0000:16:00.0 name tx_scheduling_layers |
名称 |
模式 |
描述 |
|
runtime |
通过调整调度器带宽来控制环回行为。它会影响所有类型的功能:物理、虚拟和子功能。支持的值为
|
信息版本¶
ice
驱动程序报告以下版本
名称 |
类型 |
示例 |
描述 |
|
固定 |
K65390-000 |
电路板的产品电路板组件 (PBA) 标识符。 |
|
固定 |
36 |
时钟生成单元 (CGU) 硬件修订标识符。 |
|
正在运行 |
2.1.7 |
设备嵌入式管理处理器上运行的管理固件的 3 位版本号。它控制 PHY、链路、对设备资源的访问等。Intel 文档将其称为 EMP 固件。 |
|
正在运行 |
1.5.1 |
管理固件通过 AdminQ 导出的 API 的 3 位版本号(major.minor.patch)。驱动程序使用它来识别支持的命令。历史版本的内核仅显示 2 位版本号(major.minor)。 |
|
正在运行 |
0x305d955f |
管理固件的源代码的唯一标识符。 |
|
正在运行 |
1.2581.0 |
包含 UEFI 驱动程序的 Option ROM 的版本。该版本以 |
|
正在运行 |
0.80 |
定义闪存内容格式的版本。 |
|
正在运行 |
0x80002ec0 |
加载到设备上的固件映像文件的唯一标识符。也称为 NVM 的 EETRACK 标识符。 |
|
正在运行 |
ICE OS 默认软件包 |
设备中处于活动状态的 DDP 软件包的名称。DDP 软件包在初始化期间由驱动程序加载。DDP 软件包的每个变体都有一个唯一的名称。 |
|
正在运行 |
1.3.1.0 |
设备中处于活动状态的 DDP 软件包的版本。请注意,唯一标识软件包需要名称(如 |
|
正在运行 |
0xc0000001 |
加载到设备中的 DDP 软件包的唯一标识符。也称为 DDP Track ID。可用于唯一标识特定的 DDP 软件包。 |
|
正在运行 |
1.1.2000-6.7.0 |
网络列表模块的版本。此模块定义设备的以太网功能和默认设置,并由管理固件用作管理链路和设备连接的一部分。 |
|
正在运行 |
0xee16ced7 |
网络列表模块内容哈希的前 4 个字节。 |
|
正在运行 |
8032.16973825.6021 |
时钟生成单元 (CGU) 的版本。格式:<CGU 类型>.<配置版本>.<固件版本>。 |
闪存更新¶
ice
驱动程序实现使用 devlink-flash
接口的闪存更新支持。它支持使用包含 fw.mgmt
、fw.undi
和 fw.netlist
组件的组合闪存映像来更新设备闪存。
位 |
行为 |
|
不保留存储在正在更新的闪存组件中的设置。这包括覆盖确定设备将初始化的物理功能数量的端口配置。 |
|
不保留设置或标识符。使用提供的映像中的内容覆盖闪存中的所有内容,而不执行任何保留。这包括覆盖设备识别字段,如 MAC 地址、VPD 区域和设备序列号。预计此组合将与为特定设备定制的映像一起使用。 |
ice 硬件不支持仅覆盖标识符同时保留设置,因此单独使用 DEVLINK_FLASH_OVERWRITE_IDENTIFIERS
将被拒绝。如果没有提供覆盖掩码,则在更新时将指示固件保留所有设置和识别字段。
重新加载¶
ice
驱动程序支持使用带有 DEVLINK_RELOAD_ACTION_FW_ACTIVATE
操作的 DEVLINK_CMD_RELOAD
在闪存更新后激活新固件。
$ devlink dev reload pci/0000:01:00.0 reload action fw_activate
通过发出设备特定的嵌入式管理处理器重置来激活新固件,该重置请求设备重置并重新加载 EMP 固件映像。
驱动程序当前不支持通过 DEVLINK_RELOAD_ACTION_DRIVER_REINIT
重新加载驱动程序。
端口拆分¶
ice
驱动程序仅支持端口 0 的端口拆分,因为 FW 对整个设备具有一组预定义的可用端口拆分选项。
需要重新启动系统才能应用端口拆分。
以下命令将选择具有 4 个端口的端口拆分选项
$ devlink port split pci/0000:16:00.0/0 count 4
每次 split
和 unsplit
命令后,所有可用端口选项的列表都将打印到动态调试中。第一个选项是默认选项。
ice 0000:16:00.0: Available port split options and max port speeds (Gbps):
ice 0000:16:00.0: Status Split Quad 0 Quad 1
ice 0000:16:00.0: count L0 L1 L2 L3 L4 L5 L6 L7
ice 0000:16:00.0: Active 2 100 - - - 100 - - -
ice 0000:16:00.0: 2 50 - 50 - - - - -
ice 0000:16:00.0: Pending 4 25 25 25 25 - - - -
ice 0000:16:00.0: 4 25 25 - - 25 25 - -
ice 0000:16:00.0: 8 10 10 10 10 10 10 10 10
ice 0000:16:00.0: 1 100 - - - - - - -
可能有多个具有相同端口拆分计数的 FW 端口选项。再次发出相同的端口拆分计数请求时,将选择具有相同端口拆分计数的下一个 FW 端口选项。
devlink port unsplit
将选择拆分计数为 1 的选项。如果没有拆分计数为 1 的 FW 选项可用,您将收到错误。
区域¶
ice
驱动程序实现了以下区域,用于访问内部设备数据。
名称 |
描述 |
|
整个闪存芯片的内容,有时被称为设备的非易失性存储器。 |
|
影子 RAM 的内容,它从闪存的开头加载。虽然内容主要来自闪存,但此区域还包含设备启动期间生成的数据,这些数据未存储在闪存中。 |
|
设备固件的能力缓冲区的内容。可用于确定设备的当前状态和配置。 |
nvm-flash
和 shadow-ram
区域都可以在没有快照的情况下访问。 device-caps
区域需要快照,因为内容由固件发送,并且不能拆分为单独的读取操作。
用户可以通过 DEVLINK_CMD_REGION_NEW
命令请求立即捕获所有三个区域的快照。
$ devlink region show
pci/0000:01:00.0/nvm-flash: size 10485760 snapshot [] max 1
pci/0000:01:00.0/device-caps: size 4096 snapshot [] max 10
$ devlink region new pci/0000:01:00.0/nvm-flash snapshot 1
$ devlink region dump pci/0000:01:00.0/nvm-flash snapshot 1
$ devlink region dump pci/0000:01:00.0/nvm-flash snapshot 1
0000000000000000 0014 95dc 0014 9514 0035 1670 0034 db30
0000000000000010 0000 0000 ffff ff04 0029 8c00 0028 8cc8
0000000000000020 0016 0bb8 0016 1720 0000 0000 c00f 3ffc
0000000000000030 bada cce5 bada cce5 bada cce5 bada cce5
$ devlink region read pci/0000:01:00.0/nvm-flash snapshot 1 address 0 length 16
0000000000000000 0014 95dc 0014 9514 0035 1670 0034 db30
$ devlink region delete pci/0000:01:00.0/nvm-flash snapshot 1
$ devlink region new pci/0000:01:00.0/device-caps snapshot 1
$ devlink region dump pci/0000:01:00.0/device-caps snapshot 1
0000000000000000 01 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00
0000000000000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000020 02 00 02 01 32 03 00 00 0a 00 00 00 25 00 00 00
0000000000000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000040 04 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00
0000000000000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000060 05 00 01 00 03 00 00 00 00 00 00 00 00 00 00 00
0000000000000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000080 06 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00
0000000000000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000000a0 08 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000000c0 12 00 01 00 01 00 00 00 01 00 01 00 00 00 00 00
00000000000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000000e0 13 00 01 00 00 01 00 00 00 00 00 00 00 00 00 00
00000000000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000100 14 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00
0000000000000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000120 15 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00
0000000000000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000140 16 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00
0000000000000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000160 17 00 01 00 06 00 00 00 00 00 00 00 00 00 00 00
0000000000000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000180 18 00 01 00 01 00 00 00 01 00 00 00 08 00 00 00
0000000000000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000001a0 22 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00
00000000000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000001c0 40 00 01 00 00 08 00 00 08 00 00 00 00 00 00 00
00000000000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000000000001e0 41 00 01 00 00 08 00 00 00 00 00 00 00 00 00 00
00000000000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000000000000200 42 00 01 00 00 08 00 00 00 00 00 00 00 00 00 00
0000000000000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
$ devlink region delete pci/0000:01:00.0/device-caps snapshot 1
Devlink 速率¶
ice
驱动程序实现了 devlink-rate API。它允许将分层 QoS 卸载到硬件。它使用户能够将虚拟功能分组到树结构中,并为树中的每个节点分配支持的参数:tx_share、tx_max、tx_priority 和 tx_weight。因此,用户实际上获得了控制为每个 VF 组分配多少带宽的能力。这稍后由硬件强制执行。
假设此功能与 FW 中执行的 DCB 和 ADQ,或任何会触发 QoS 更改的驱动程序功能(例如,创建新的流量类别)互斥。如果用户开始使用 devlink-rate API 对节点进行任何更改,驱动程序将阻止 DCB 或 ADQ 配置。要配置这些功能,需要重新加载驱动程序。相应地,如果配置了 ADQ 或 DCB,驱动程序将根本不导出层次结构,或者如果在导出层次结构后但在进行任何更改之前启用了这些功能,则会删除未触及的层次结构。
此功能还依赖于系统中启用的 switchdev。这是必需的,因为 devlink-rate 需要 devlink-port 对象存在,而这些对象仅在 switchdev 模式下创建。
如果驱动程序设置为 switchdev 模式,它将在创建 VF 时立即导出内部层次结构。树的根始终由 node_0 表示。用户无法删除此节点。叶节点和带有子节点的节点也无法删除。
名称 |
描述 |
|
树节点要消耗的最大带宽。速率限制是一个绝对数字,指定节点在一秒钟内可以消耗的最大字节数。速率限制保证链路不会使远程端的接收器过饱和,并且还在订户和网络提供商之间强制执行 SLA。 |
|
在未阻塞时分配给树节点的最小带宽。它指定一个绝对带宽。虽然 tx_max 定义了节点可能消耗的最大带宽,但 tx_share 标记了节点的承诺带宽。 |
|
允许在兄弟节点之间使用严格优先级仲裁器。只要节点保持在其带宽限制内,此仲裁方案就会尝试根据其优先级安排节点。范围 0-7。优先级为 7 的节点具有最高优先级并首先被选中,而优先级为 0 的节点具有最低优先级。具有相同优先级的节点被平等对待。 |
|
允许在兄弟节点之间使用加权公平队列仲裁方案。此仲裁方案可以与严格优先级同时使用。范围 1-200。只有相对值对仲裁有意义。 |
tx_priority
和 tx_weight
可以同时使用。在这种情况下,具有相同优先级的节点在兄弟组中形成一个 WFQ 子组,并且它们之间的仲裁基于分配的权重。
# enable switchdev
$ devlink dev eswitch set pci/0000:4b:00.0 mode switchdev
# at this point driver should export internal hierarchy
$ echo 2 > /sys/class/net/ens785np0/device/sriov_numvfs
$ devlink port function rate show
pci/0000:4b:00.0/node_25: type node parent node_24
pci/0000:4b:00.0/node_24: type node parent node_0
pci/0000:4b:00.0/node_32: type node parent node_31
pci/0000:4b:00.0/node_31: type node parent node_30
pci/0000:4b:00.0/node_30: type node parent node_16
pci/0000:4b:00.0/node_19: type node parent node_18
pci/0000:4b:00.0/node_18: type node parent node_17
pci/0000:4b:00.0/node_17: type node parent node_16
pci/0000:4b:00.0/node_14: type node parent node_5
pci/0000:4b:00.0/node_5: type node parent node_3
pci/0000:4b:00.0/node_13: type node parent node_4
pci/0000:4b:00.0/node_12: type node parent node_4
pci/0000:4b:00.0/node_11: type node parent node_4
pci/0000:4b:00.0/node_10: type node parent node_4
pci/0000:4b:00.0/node_9: type node parent node_4
pci/0000:4b:00.0/node_8: type node parent node_4
pci/0000:4b:00.0/node_7: type node parent node_4
pci/0000:4b:00.0/node_6: type node parent node_4
pci/0000:4b:00.0/node_4: type node parent node_3
pci/0000:4b:00.0/node_3: type node parent node_16
pci/0000:4b:00.0/node_16: type node parent node_15
pci/0000:4b:00.0/node_15: type node parent node_0
pci/0000:4b:00.0/node_2: type node parent node_1
pci/0000:4b:00.0/node_1: type node parent node_0
pci/0000:4b:00.0/node_0: type node
pci/0000:4b:00.0/1: type leaf parent node_25
pci/0000:4b:00.0/2: type leaf parent node_25
# let's create some custom node
$ devlink port function rate add pci/0000:4b:00.0/node_custom parent node_0
# second custom node
$ devlink port function rate add pci/0000:4b:00.0/node_custom_1 parent node_custom
# reassign second VF to newly created branch
$ devlink port function rate set pci/0000:4b:00.0/2 parent node_custom_1
# assign tx_weight to the VF
$ devlink port function rate set pci/0000:4b:00.0/2 tx_weight 5
# assign tx_share to the VF
$ devlink port function rate set pci/0000:4b:00.0/2 tx_share 500Mbps