Switchdev

版权:

© 2023, NVIDIA CORPORATION 及其附属公司。保留所有权利。

网桥卸载

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 功能共享,也不从父 PCI 功能窃取。

当子功能支持 RDMA 时,它拥有自己的 QP1、GID 表和 RDMA 资源,这些资源既不与父 PCI 功能共享,也不从父 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
    
  • 激活功能并验证其状态为活动

    $ 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