BlueField 可扩展功能用户指南
本文档概述了 NVIDIA® BlueField® DPU 的可扩展功能(子功能或 SF)及其配置。
可扩展功能 (SF) 或子功能与虚拟功能 (VF) 非常相似,后者是单根 I/O 虚拟化 (SR-IOV) 解决方案的一部分。I/O 虚拟化是当今数据中心使用的关键功能之一。它通过使虚拟机可以直接访问硬件 I/O 设备来提高企业服务器的性能。SR-IOV 规范允许一个 PCI Express (PCIe) 设备向主机呈现为多个不同的“虚拟”设备。这是通过添加到传统 PCIe 功能(即,物理功能或 PF)的新 PCIe 功能结构来完成的。
PF 提供对新 VF 的创建和分配的控制。VF 共享设备的基础硬件和 PCIe。SR-IOV 规范的一个关键特性是 VF 非常轻量级,因此可以在单个设备中实现许多 VF。
为了利用 BlueField 中 VF 的功能,使用了 SF。与 VF 相比,SF 允许支持更多数量的功能,更重要的是,它们允许在 DPU 上同时运行多个服务。
SF 是一种轻量级功能,它具有部署它的父 PCIe 功能。因此,SF 可以访问其父 PCIe 功能的功能和资源,并具有其自身的功能和资源。这意味着 SF 也将拥有自己的专用队列(即,txq、rxq)。
SF 与 PCIe SR-IOV 虚拟功能(在主机上)共存,但也不需要启用 PCIe SR-IOV。
SF 支持像现有 PF 和 VF representor 一样的 E-Switch representor 卸载。SF 与其他 SF 和/或其父 PCIe 功能共享 PCIe 级别的资源。

有关如何安装 BlueField 相关软件的详细信息,请参阅Linux 版 DOCA 安装指南。
确保您的固件版本为 20.30.1004 或更高版本
通过设置以下 Kconfig 标志来启用对 Linux 内核 mlx5 SF 的支持
MLX5_ESWITCH
MLX5_SF
要在设备上启用 SF 支持,请更改每个端口的 PCIe 地址
$ mlxconfig -d 0000:03:00.0 s PF_BAR2_ENABLE=0 PER_PF_NUM_SF=1 PF_TOTAL_SF=236 PF_SF_BAR_SIZE=10 PF_BAR2_ENABLE: if this config is set, then all PFs and ECPFs have the same number of SFs. This should be off (deprecated). If set. PF_TOTAL_SF and PF_SF_BAR_SIZE won’t work. PER_PF_NUM_SF: If this config is set, each PF and ECPF configure/control its own number of SFs. THE ABOVE TWO CONFIGS AFFECS BOTH BF AND HOST, TREAT WITH CARE! Also, only one of them can be set. It is INVALID to set them both PF_TOTAL_SF: maximum number of SFs we wish to configure for the given PF/ECPF. PF_SF_BAR_SIZE: size of each SF at the BAR2. The size is in powers of 2 in KB. For example: PF_SF_BAR_SIZE=10 means each SF is taking 1MB of the BAR. PF_TOTAL_SF=14 means this PCI function can create up to 14 SFs. In total: FW will allocate 14MB of BAR2.
注意执行BlueField 系统级重置,以使
mlxconfig
设置生效。
要使用 SF,必须首先遵循 3 步设置顺序
创建。
配置。
部署。

可以使用 mlxdevm
工具执行这些步骤。
当在上游内核之上工作时,mlxdevm
工具在该内核上不可用,请参阅可扩展功能的上游指南,以获取有关使用 devlink
工具的说明,该工具应替代使用。
使用 mlxdevm 工具进行配置
创建 SF。
SF 使用 iproute2 软件包提供的
mlxdevm
工具进行管理。该工具位于/opt/mellanox/iproute2/sbin/mlxdevm
。SF 是使用
mlxdevm
工具创建的。通过添加pcisf
flavor 的端口来创建 SF。要创建 SF 端口 representor,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port add pci/<pci_address> flavour pcisf pfnum <corresponding pfnum> sfnum <sfnum>
注意每个 SF 必须具有唯一的编号 (
<sfnum>
)。例如
/opt/mellanox/iproute2/sbin/mlxdevm port add pci/0000:03:00.0 flavour pcisf pfnum 0 sfnum 4
输出示例
pci/0000:30:00.0/229409: type eth netdev eth0 flavour pcisf controller 0 pfnum 0 sfnum 4 function: hw_addr 00:00:00:00:00:00 state inactive opstate detached roce true max_uc_macs 128 trust off
需要编号 229409 才能完成以下两个步骤(即,配置和部署)。
pci/0000:03:00.0/229409
称为 SF 索引。pci/<pci_address>/<sf_index>
可以替换为<representor_name>
。例如pci/0000:03:00.0/229409 = en3f0pf0sf4
要查看有关已创建 SF 的信息,例如其 MAC 地址、信任模式或状态(活动/非活动),请运行以下命令
/opt/mellanox/iproute2/sbin/mlxdevm port show
输出示例
pci/0000:30:00.0/229409: type eth netdev en3f0pf0sf4 eth0 flavor pcisf controller 0 pfnum 0 sfnum 4 function: hw_addr 00:00:00:00:00:00 state inactive opstate detached roce true max_uc_macs 128 trust off
注意SF 编号 ≥1000 保留用于virtio-net 控制器。
注意当在外部控制器(例如,BlueField)上添加 SF 时,用户必须提供控制器编号。在单主机 BlueField 情况下,只有一个控制器,控制器编号从 1 开始。以下是在外部控制器 1 的 PF0 上添加 SF 的示例
$ mlxdevm port add pci/
0000
:03
:00.0
flavour pcisf pfnum0
sfnum88
controller1
pci/0000
:03
:00.0
/32768
: type eth netdev eth6 flavour pcisf controller1
pfnum0
sfnum88
splittablefalse
function: hw_addr00
:00
:00
:00
:00
:00
state inactive opstate detached配置 SF。
子功能 representor(SF 端口 representor)已创建,但尚未部署。用户应配置硬件地址(例如,MAC 地址),将信任模式设置为 on,并在部署 SF 之前激活 SF。
以下步骤可以作为单独的命令(以任何顺序)执行,也可以组合为一个命令
要配置硬件地址,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/<pci_address>/<sf_index> hw_addr <MAC address>
要将信任模式设置为 on,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/<pci_address>/<sf_index> trust on
信息受信任的功能具有额外的权限(例如,更新转向数据库的能力)。
要激活已创建的 SF,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/<pci_address>/<sf_index> state active
或者,要配置 MAC 地址,将信任模式设置为 on,并将状态设置为 active,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/<pci_address>/<sf_index> hw_addr <mac_address> trust on state active
例如
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/
0000
:03
:00.0
/229409
hw_addr00
:00
:00
:00
:04
:0
trust on state active注意必须在部署 SF 之前设置上述 SF 功能。
部署 SF。
要从默认配置驱动程序取消绑定 SF 并绑定实际的 SF 驱动程序,请运行
echo mlx5_core.sf.<next_serial> > /sys/bus/auxiliary/drivers/mlx5_core.sf_cfg/unbind echo mlx5_core.sf.<next_serial> > /sys/bus/auxiliary/drivers/mlx5_core.sf/bind
例如
echo mlx5_core.sf.4 > /sys/bus/auxiliary/drivers/mlx5_core.sf_cfg/unbind echo mlx5_core.sf.4 > /sys/bus/auxiliary/drivers/mlx5_core.sf/bind
注意<next_serial>
是固件在创建 SF 时生成的编号(这是 SF 的 gvmi 编号)。mlxdevm
工具在创建 SF 时生成此编号。要获取它,请参阅下面提供的有用的命令。注意有兴趣使用 SF netdevice 和 RDMA 设备的应用程序必须通过 udev 监视器监视 RDMA 和 netdevice,或者轮询 SF 辅助设备的 sysfs 层级结构。
有用的命令
要查看可用的子功能,请运行
$ devlink dev show
例如,如果您在创建、配置和部署 SF(使用前面详细介绍的步骤)之前运行该命令,则输出将如下所示
pci/0000:03:00.0 pci/0000:03:00.1 auxiliary/mlx5_core.sf.2 auxiliary/mlx5_core.sf.3
在创建、配置和部署 SF 之后,输出将是
pci/0000:03:00.0 pci/0000:03:00.1 auxiliary/mlx5_core.sf.2 auxiliary/mlx5_core.sf.3 auxiliary/mlx5_core.sf.4
请注意,
<next_serial>
编号对于创建的 SF 为 4。要查看每个子功能的
sfnum
,请运行cat /sys/bus/auxiliary/devices/mlx5_core.sf.<next_serial>/sfnum
例如
cat /sys/bus/auxiliary/devices/mlx5_core.sf.4/sfnum
示例输出
cat /sys/bus/auxiliary/devices/mlx5_core.sf.4/sfnum 4
要删除 SF,您必须首先使其状态变为非活动状态,然后才能删除 SF representor。
要使 SF 的状态变为非活动状态,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/<pci_address>/<sf_index> state inactive
要删除 SF 端口 representor,请运行
/opt/mellanox/iproute2/sbin/mlxdevm port del pci/<pci_address>/<sf_index>
例如
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/0000:03:00.0/229409 state inactive /opt/mellanox/iproute2/sbin/mlxdevm port del pci/0000:03:00.0/229409
使用 SF。
在 DPU 上运行应用程序需要 OVS 配置。通过创建 SF,还会为 OVS 创建 SF representor,并命名为
en3f0pf*sf*
。因此,每个 representor 都需要连接到正确的 OVS 网桥。注意插图中的配置需要两个与同一 PCIe 相关的 SF。
以下示例配置 2 个 SF,并将其 representor 添加到 OVS。
创建、配置和部署 SF。运行
/opt/mellanox/iproute2/sbin/mlxdevm port add pci/0000:03:00.0 flavour pcisf pfnum 0 sfnum 4 /opt/mellanox/iproute2/sbin/mlxdevm port add pci/0000:03:00.0 flavour pcisf pfnum 0 sfnum 5
使用命令
mlxdevm port show
,您可以查看已创建 SF 的 SF 索引。/opt/mellanox/iproute2/sbin/mlxdevm port show
输出示例
pci/0000:30:00.0/229409: type eth netdev en3f0pf0sf4 flavour pcisf controller 0 pfnum 0 sfnum 4 function: hw_addr 00:00:00:00:00:00 state inactive opstate detached roce true max_uc_macs 128 trust off pci/0000:30:00.0/229410: type eth netdev en3f0pf0sf5 flavour pcisf controller 0 pfnum 0 sfnum 5 function: hw_addr 00:00:00:00:00:00 state inactive opstate detached roce true max_uc_macs 128 trust off
配置 MAC 地址,将信任模式设置为 on,并激活已创建的 SF
/opt/mellanox/iproute2/sbin/mlxdevm port function set pci/0000:03:00.0/229409 hw_addr 02:25:f2:8d:a2:4c trust on state active /opt/mellanox/iproute2/sbin/mlxdevm port function set pci/0000:03:00.0/229410 hw_addr 02:25:f2:8d:a2:5c trust on state active
使用
ifconfig
,您可能会看到添加了 2 个网络接口:en3f0pf0sf4
和en3f0pf0sf5
,分别用于两个 SF 端口 representor。删除现有的 OVS 网桥(可选)。
例如,运行以下命令以删除名为
ovsbr1
的 OVS 网桥ovs-vsctl del-br ovsbr1
创建两个网桥
sf_bridge1
和sf_bridge2
,并将它们配置如下ovs-vsctl add-br sf_bridge1 ovs-vsctl add-br sf_bridge2 ovs-vsctl add-port sf_bridge1 p0 ovs-vsctl add-port sf_bridge2 pf0hpf
将端口 representor 添加到 OVS 网桥
ovs-vsctl add-port sf_bridge1 en3f0pf0sf4 ovs-vsctl add-port sf_bridge2 en3f0pf0sf5
添加 SF representor 后的 OVS 网桥
Bridge sf_bridge1 Port p0 Interface p0 Port sf_bridge1 Interface sf_bridge1 type: internal Port en3f0pf0sf4 Interface en3f0pf0sf4 Bridge sf_bridge2 Port sf_bridge2 Interface sf_bridge2 type: internal Port en3f0pf0sf5 Interface en3f0pf0sf5 Port pf0hpf Interface pf0hpf ovs_version: "2.14.1"
注意接口可能默认处于关闭状态。请记住使用
ifconfing
将接口设置为“up”状态。注意删除 SF 端口 representor 时,您还必须使用命令
ovs-vsctl port-del en3f0pf0sf*
将其从连接到的网桥上分离。否则,端口 representor 仍将连接到网桥,但无法识别。要运行应用程序,请使用以下命令在运行时初始化 SF
*Executable_binary* -a auxiliary:mlx5_core.sf.* -a auxiliary:mlx5_core.sf.*
例如
doca_<app_name> -a auxiliary:mlx5_core.sf.4 -a auxiliary:mlx5_core.sf.5 -- [application_flags]