Switchdev¶
- 版权:
© 2023, NVIDIA CORPORATION & AFFILIATES. 保留所有权利。
桥接卸载¶
mlx5 驱动程序在 switchdev 模式下实现桥接规则的卸载支持。当 mlx5 switchdev 表示符附加到网桥时,Linux 网桥 FDB 会自动卸载。
将设备更改为 switchdev 模式
$ devlink dev eswitch set pci/0000:06:00.0 mode switchdev
将 mlx5 switchdev 表示符 ‘enp8s0f0’ 附加到网桥网络设备 ‘bridge1’
$ ip link set enp8s0f0 master bridge1
VLAN¶
mlx5 支持以下网桥 VLAN 功能
VLAN 过滤(包括每个端口多个 VLAN)
$ ip link set bridge1 type bridge vlan_filtering 1 $ bridge vlan add dev enp8s0f0 vid 2-3
在网桥入口推送 VLAN
$ bridge vlan add dev enp8s0f0 vid 3 pvid
在网桥出口弹出 VLAN
$ bridge vlan add dev enp8s0f0 vid 3 untagged
子功能¶
在 E-switch 上生成的子功能仅使用 devlink 设备创建,默认情况下禁用所有 SF 辅助设备。 这将允许用户在 SF 完全探测之前配置 SF,从而节省时间。
使用示例
创建 SF
$ devlink port add pci/0000:08:00.0 flavour pcisf pfnum 0 sfnum 11 $ devlink port function set pci/0000:08:00.0/32768 hw_addr 00:00:00:00:00:11 state active
启用 ETH 辅助设备
$ devlink dev param set auxiliary/mlx5_core.sf.1 name enable_eth value true cmode driverinit
现在,为了完全探测 SF,请使用 devlink reload
$ devlink dev reload auxiliary/mlx5_core.sf.1
mlx5 支持 ETH、rdma 和 vdpa (vnet) 辅助设备 devlink 参数(请参阅 Documentation/networking/devlink/devlink-params.rst)。
mlx5 支持使用 devlink 端口进行子功能管理(请参阅 Documentation/networking/devlink/devlink-port.rst)接口。
子功能具有其自己的功能能力和资源。这意味着子功能具有其自己的专用队列(txq、rxq、cq、eq)。这些队列既不共享,也不从父 PCI 功能中窃取。
当子功能具有 RDMA 功能时,它具有自己的 QP1、GID 表和 RDMA 资源,这些资源既不共享,也不从父 PCI 功能中窃取。
子功能在 PCI BAR 空间中有一个专用的窗口,该窗口不与其他子功能或父 PCI 功能共享。这确保了子功能的所有设备(netdev、rdma、vdpa 等)仅访问分配的 PCI BAR 空间。
子功能支持 eswitch 表示,通过该表示支持 tc 卸载。 用户配置 eswitch 以从子功能端口发送/接收数据包。
子功能与其它子功能和/或其父 PCI 功能共享 PCI 级别的资源,例如 PCI MSI-X IRQ。
示例 mlx5 软件、系统和设备视图
_______
| admin |
| user |----------
|_______| |
| |
____|____ __|______ _________________
| | | | | |
| devlink | | tc tool | | user |
| tool | |_________| | applications |
|_________| | |_________________|
| | | |
| | | | Userspace
+---------|-------------|-------------------|----------|--------------------+
| | +----------+ +----------+ Kernel
| | | netdev | | rdma dev |
| | +----------+ +----------+
(devlink port add/del | ^ ^
port function set) | | |
| | +---------------|
_____|___ | | _______|_______
| | | | | mlx5 class |
| devlink | +------------+ | | drivers |
| kernel | | rep netdev | | |(mlx5_core,ib) |
|_________| +------------+ | |_______________|
| | | ^
(devlink ops) | | (probe/remove)
_________|________ | | ____|________
| subfunction | | +---------------+ | subfunction |
| management driver|----- | subfunction |---| driver |
| (mlx5_core) | | auxiliary dev | | (mlx5_core) |
|__________________| +---------------+ |_____________|
| ^
(sf add/del, vhca events) |
| (device add/del)
_____|____ ____|________
| | | subfunction |
| PCI NIC |--- activate/deactivate events--->| host driver |
|__________| | (mlx5_core) |
|_____________|
使用 devlink 端口接口创建子功能。
将设备更改为 switchdev 模式
$ devlink dev eswitch set pci/0000:06:00.0 mode switchdev
添加一个子功能类型的 devlink 端口
$ devlink port add pci/0000:06:00.0 flavour pcisf pfnum 0 sfnum 88 pci/0000:06:00.0/32768: type eth netdev eth6 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false function: hw_addr 00:00:00:00:00:00 state inactive opstate detached
显示子功能的 devlink 端口
$ devlink port show pci/0000:06:00.0/32768 pci/0000:06:00.0/32768: type eth netdev enp6s0pf0sf88 flavour pcisf pfnum 0 sfnum 88 function: hw_addr 00:00:00:00:00:00 state inactive opstate detached
使用后删除子功能的 devlink 端口
$ devlink port del pci/0000:06:00.0/32768
功能属性¶
mlx5 驱动程序提供了一种机制,以统一的方式为 SmartNIC 和非 SmartNIC 设置 PCI VF/SF 功能属性。
仅当 eswitch 模式设置为 switchdev 时才支持此功能。 PCI VF/SF 的端口功能配置通过 devlink eswitch 端口支持。
端口功能属性应在驱动程序枚举 PCI VF/SF 之前设置。
MAC 地址设置¶
mlx5 驱动程序支持 devlink 端口功能属性机制来设置 MAC 地址。(请参阅 Devlink 端口)
RoCE 功能设置¶
并非所有 mlx5 PCI 设备/SF 都需要 RoCE 功能。
禁用 RoCE 功能后,每个 PCI 设备/SF 可节省 1 MB 的系统内存。
mlx5 驱动程序支持 devlink 端口功能属性机制来设置 RoCE 功能。(请参阅 Devlink 端口)
可迁移功能设置¶
希望 mlx5 PCI VF 能够执行实时迁移的用户需要显式启用 VF 可迁移功能。
mlx5 驱动程序支持 devlink 端口功能属性机制来设置可迁移功能。(请参阅 Devlink 端口)
IPsec 加密功能设置¶
希望 mlx5 PCI VF 能够执行 IPsec 加密卸载的用户需要显式启用 VF ipsec_crypto 功能。从 ConnectX6dx 设备及更高版本开始,支持为 VF 启用 IPsec 功能。当 VF 启用了 IPsec 功能时,PF 上的任何 IPsec 卸载都会被阻止。
mlx5 驱动程序支持 devlink 端口功能属性机制来设置 ipsec_crypto 功能。(请参阅 Devlink 端口)
IPsec 数据包功能设置¶
希望 mlx5 PCI VF 能够执行 IPsec 数据包卸载的用户需要显式启用 VF ipsec_packet 功能。从 ConnectX6dx 设备及更高版本开始,支持为 VF 启用 IPsec 功能。当 VF 启用了 IPsec 功能时,PF 上的任何 IPsec 卸载都会被阻止。
mlx5 驱动程序支持 devlink 端口功能属性机制来设置 ipsec_packet 功能。(请参阅 Devlink 端口)
SF 状态设置¶
要使用 SF,用户必须使用 SF 功能状态属性激活 SF。
获取由其唯一 devlink 端口索引标识的 SF 的状态
$ devlink port show ens2f0npf0sf88 pci/0000:06:00.0/32768: type eth netdev ens2f0npf0sf88 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false function: hw_addr 00:00:00:00:88:88 state inactive opstate detached
激活功能并验证其状态是否为 active
$ devlink port function set ens2f0npf0sf88 state active $ devlink port show ens2f0npf0sf88 pci/0000:06:00.0/32768: type eth netdev ens2f0npf0sf88 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false function: hw_addr 00:00:00:00:88:88 state active opstate detached
激活功能后,PF 驱动程序实例会从设备收到事件,表明已激活特定的 SF。这是将设备放置在总线上、对其进行探测并实例化 devlink 实例和特定于类的辅助设备的提示。
显示子功能的辅助设备和端口
$ devlink dev show devlink dev show auxiliary/mlx5_core.sf.4 $ devlink port show auxiliary/mlx5_core.sf.4/1 auxiliary/mlx5_core.sf.4/1: type eth netdev p0sf88 flavour virtual port 0 splittable false $ rdma link show mlx5_0/1 link mlx5_0/1 state ACTIVE physical_state LINK_UP netdev p0sf88 $ rdma dev show 8: rocep6s0f1: node_type ca fw 16.29.0550 node_guid 248a:0703:00b3:d113 sys_image_guid 248a:0703:00b3:d112 13: mlx5_0: node_type ca fw 16.29.0550 node_guid 0000:00ff:fe00:8888 sys_image_guid 248a:0703:00b3:d112
子功能辅助设备和类设备层次结构
mlx5_core.sf.4 (subfunction auxiliary device) /\ / \ / \ / \ / \ mlx5_core.eth.4 mlx5_core.rdma.4 (sf eth aux dev) (sf rdma aux dev) | | | | p0sf88 mlx5_0 (sf netdev) (sf rdma device)
此外,当驱动程序附加到子功能的辅助设备时,SF 端口也会收到该事件。 这会导致更改该功能的运行状态。 这为用户提供了可见性,以确定何时删除 SF 端口以优雅地终止子功能是安全的。
显示 SF 端口的运行状态
$ devlink port show ens2f0npf0sf88 pci/0000:06:00.0/32768: type eth netdev ens2f0npf0sf88 flavour pcisf controller 0 pfnum 0 sfnum 88 external false splittable false function: hw_addr 00:00:00:00:88:88 state active opstate attached