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