Marvell OcteonTx2 RVU 内核驱动程序¶
版权所有 (c) 2020 Marvell International Ltd.
目录¶
概述¶
Marvell 的 OcteonTX2 SOC 上的资源虚拟化单元 (RVU) 将来自网络、加密和其他功能块的硬件资源映射到 PCI 兼容的物理和虚拟功能中。每个功能块又有多个本地功能 (LF),用于为 PCI 设备配置。RVU 支持多个 PCIe SRIOV 物理功能 (PF) 和虚拟功能 (VF)。PF0 被称为管理/管理功能 (AF),并具有将 RVU 功能块的 LF 配置到每个 PF/VF 的权限。
- RVU 管理的网络功能块
网络池或缓冲区分配器 (NPA)
网络接口控制器 (NIX)
网络解析器 CAM (NPC)
调度/同步/排序单元 (SSO)
环回接口 (LBK)
- RVU 管理的非网络功能块
加密加速器 (CPT)
计划定时器单元 (TIM)
调度/同步/排序单元 (SSO) 用于网络和非网络用例
- 资源配置示例
具有 NIX-LF 和 NPA-LF 资源的 PF/VF 作为纯网络设备工作
具有 CPT-LF 资源的 PF/VF 作为纯加密卸载设备工作。
RVU 功能块可根据软件要求进行高度配置。
- 固件在内核启动前设置以下内容
根据物理链路的数量启用所需数量的 RVU PF。
每个 PF 的 VF 数量是静态的还是在编译时可配置的。根据配置,固件将 VF 分配给每个 PF。
还将 MSIX 向量分配给每个 PF 和 VF。
这些在内核启动后不会更改。
驱动程序¶
Linux 内核将有多个驱动程序注册到 RVU 的不同 PF 和 VF。关于网络,将有 3 种类型的驱动程序。
管理功能驱动程序¶
如上所述,RVU PF0 被称为管理功能 (AF),此驱动程序支持功能块的资源配置和配置。不处理任何 I/O。它设置一些基本内容,但大多数功能是通过来自 PF 和 VF 的配置请求实现的。
PF/VF 通过共享内存区域(邮箱)与 AF 通信。收到请求后,AF 会进行资源配置和其他硬件配置。AF 始终附加到主机内核,但 PF 及其 VF 可以由主机内核本身使用,也可以附加到虚拟机或用户空间应用程序(如 DPDK 等)。因此,AF 必须处理来自任何域的任何设备发送的配置请求。
- AF 驱动程序还与底层固件交互以
管理物理以太网链路,即 CGX LMAC。
检索速度、双工、自动协商等信息
检索 PHY EEPROM 和统计信息。
配置 FEC、PAM 模式
等等
- 从纯网络方面来看,AF 驱动程序支持以下功能。
将物理链路映射到已注册 netdev 的 RVU PF。
将 NIX 和 NPA 块 LF 附加到 RVU PF/VF,这为常规网络功能提供缓冲区池、RQ、SQ。
流控制(暂停帧)启用/禁用/配置。
与硬件 PTP 时间戳相关的配置。
NPC 解析器配置文件配置,基本上是如何解析数据包以及要提取哪些信息。
NPC 提取配置文件配置,要从数据包中提取哪些内容以匹配 MCAM 条目中的数据。
管理 NPC MCAM 条目,根据请求可以构建和安装请求的数据包转发规则。
定义接收端缩放 (RSS) 算法。
定义分段卸载算法(例如 TSO)
VLAN 剥离、捕获和插入配置。
提供数据包调度支持的 SSO 和 TIM 块配置。
Debugfs 支持,用于检查当前资源配置、NPA 池的当前状态、NIX RQ、SQ 和 CQ、各种统计信息等,这有助于调试问题。
等等。
物理功能驱动程序¶
此 RVU PF 处理 IO,映射到物理以太网链路,此驱动程序注册 netdev。这支持 SR-IOV。如上所述,此驱动程序通过邮箱与 AF 通信。为了从物理链路检索信息,此驱动程序与 AF 通信,AF 从固件获取信息并响应,即不能直接与固件通信。
支持 ethtool 来配置链路、RSS、队列计数、队列大小、流控制、ntuple 过滤器、转储 PHY EEPROM、配置 FEC 等。
虚拟功能驱动程序¶
有两种类型的 VF,一种是与父 SR-IOV PF 共享物理链路的 VF,另一种是使用内部硬件环回通道 (LBK) 成对工作的 VF。
- 类型 1
这些 VF 及其父 PF 共享一个物理链路,用于外部通信。
VF 不能直接与 AF 通信,它们将 mbox 消息发送到 PF,PF 将其转发到 AF。AF 处理后,会响应 PF,PF 将回复转发给 VF。
从功能角度来看,PF 和 VF 之间没有区别,因为相同类型的硬件资源都附加到两者。但是,用户只能从 PF 配置一些内容,因为 PF 被视为链路的所有者/管理员。
- 类型 2
RVU PF0,即管理功能,创建这些 VF 并将它们映射到环回块的通道。
一组两个 VF(VF0 和 VF1、VF2 和 VF3 等)成对工作,即从 VF0 发送的数据包将由 VF1 接收,反之亦然。
应用程序或虚拟机可以使用这些 VF 来进行彼此之间的通信,而无需将流量发送到外部。硬件中没有交换机,因此支持环回 VF。
这些 VF 通过 mbox 直接与 AF (PF0) 通信。
除了用于数据包接收和传输的 IO 通道或链路外,这些 VF 类型之间没有其他区别。AF 驱动程序负责 IO 通道映射,因此相同的 VF 驱动程序适用于这两种类型的设备。
基本数据包流¶
入口¶
CGX LMAC 接收数据包。
将数据包转发到 NIX 块。
然后提交给 NPC 块进行解析,然后进行 MCAM 查找以获取目标 RVU 设备。
附加到目标 RVU 设备的 NIX LF 从 NPA 块 LF 的 RQ 映射缓冲区池中分配一个缓冲区。
可以通过 RSS 或通过使用 RQ 编号配置 MCAM 规则来选择 RQ。
数据包已 DMA 并且驱动程序收到通知。
出口¶
驱动程序准备一个发送描述符并提交给 SQ 进行传输。
SQ 已配置(由 AF)为在特定链路/通道上进行传输。
SQ 描述符环在从 NPA 块 LF 的 SQ 映射池中分配的缓冲区中维护。
NIX 块在指定的通道上传输数据包。
可以安装 NPC MCAM 条目以将数据包转移到不同的通道。
Devlink 健康报告器¶
NPA 报告器¶
NPA 报告器负责报告和恢复以下错误组
常规事件
由于未映射 PF 的操作导致的错误。
由于为其他硬件块(NIX、SSO、TIM、DPI 和 AURA)禁用 alloc/free 而导致的错误。
错误事件
由于读取 NPA_AQ_INST_S 或写入 NPA_AQ_RES_S 而导致的故障。
AQ 门铃错误。
RAS 事件
NPA_AQ_INST_S/NPA_AQ_RES_S 的 RAS 错误报告。
RVU 事件
由于未映射的插槽而导致的错误。
示例输出
~# devlink health
pci/0002:01:00.0:
reporter hw_npa_intr
state healthy error 2872 recover 2872 last_dump_date 2020-12-10 last_dump_time 09:39:09 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_gen
state healthy error 2872 recover 2872 last_dump_date 2020-12-11 last_dump_time 04:43:04 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_err
state healthy error 2871 recover 2871 last_dump_date 2020-12-10 last_dump_time 09:39:17 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_ras
state healthy error 0 recover 0 last_dump_date 2020-12-10 last_dump_time 09:32:40 grace_period 0 auto_recover true auto_dump true
每个报告器都会转储
错误类型
错误寄存器值
用文字说明原因
例如
~# devlink health dump show pci/0002:01:00.0 reporter hw_npa_gen
NPA_AF_GENERAL:
NPA General Interrupt Reg : 1
NIX0: free disabled RX
~# devlink health dump show pci/0002:01:00.0 reporter hw_npa_intr
NPA_AF_RVU:
NPA RVU Interrupt Reg : 1
Unmap Slot Error
~# devlink health dump show pci/0002:01:00.0 reporter hw_npa_err
NPA_AF_ERR:
NPA Error Interrupt Reg : 4096
AQ Doorbell Error
NIX 报告器¶
NIX 报告器负责报告和恢复以下错误组
常规事件
由于缓冲区不足而导致的接收镜像/多播数据包丢弃。
SMQ 清除操作。
错误事件
由于从多播/镜像缓冲区读取/写入 WQE 而导致的内存故障。
接收多播/镜像复制列表错误。
在未映射的 PF 上接收数据包。
由于读取 NIX_AQ_INST_S 或写入 NIX_AQ_RES_S 而导致的故障。
AQ 门铃错误。
RAS 事件
NIX 接收多播/镜像条目结构的 RAS 错误报告。
从多播/镜像缓冲区读取 WQE/数据包数据的 RAS 错误报告。
NIX_AQ_INST_S/NIX_AQ_RES_S 的 RAS 错误报告。
RVU 事件
由于未映射的插槽而导致的错误。
示例输出
~# ./devlink health
pci/0002:01:00.0:
reporter hw_npa_intr
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_gen
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_err
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_npa_ras
state healthy error 0 recover 0 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_intr
state healthy error 1121 recover 1121 last_dump_date 2021-01-19 last_dump_time 05:42:26 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_gen
state healthy error 949 recover 949 last_dump_date 2021-01-19 last_dump_time 05:42:43 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_err
state healthy error 1147 recover 1147 last_dump_date 2021-01-19 last_dump_time 05:42:59 grace_period 0 auto_recover true auto_dump true
reporter hw_nix_ras
state healthy error 409 recover 409 last_dump_date 2021-01-19 last_dump_time 05:43:16 grace_period 0 auto_recover true auto_dump true
每个报告器都会转储
错误类型
错误寄存器值
用文字说明原因
例如
~# devlink health dump show pci/0002:01:00.0 reporter hw_nix_intr
NIX_AF_RVU:
NIX RVU Interrupt Reg : 1
Unmap Slot Error
~# devlink health dump show pci/0002:01:00.0 reporter hw_nix_gen
NIX_AF_GENERAL:
NIX General Interrupt Reg : 1
Rx multicast pkt drop
~# devlink health dump show pci/0002:01:00.0 reporter hw_nix_err
NIX_AF_ERR:
NIX Error Interrupt Reg : 64
Rx on unmapped PF_FUNC
服务质量¶
调度中使用的硬件算法¶
octeontx2 芯片和 CN10K 传输接口由从 SMQ/MDQ、TL4 到 TL1 的五个传输级别组成。每个数据包都将遍历 MDQ、TL4 到 TL1 级别。每个级别都包含一个队列数组,以支持调度和整形。硬件根据调度程序队列的优先级使用以下算法。一旦用户创建具有不同优先级的 tc 类,驱动程序会使用指定的优先级以及速率限制配置来配置分配给该类的调度程序。
严格优先级
一旦数据包提交到 MDQ,硬件会使用严格优先级选取所有具有不同优先级的活动 MDQ。
轮询
使用轮询选择具有相同优先级级别的活动 MDQ。
设置 HTB 卸载¶
在接口上启用 HW TC 卸载
# ethtool -K <interface> hw-tc-offload on
创建 htb 根
# tc qdisc add dev <interface> clsact # tc qdisc replace dev <interface> root handle 1: htb offload
创建具有不同优先级的 tc 类
# tc class add dev <interface> parent 1: classid 1:1 htb rate 10Gbit prio 1 # tc class add dev <interface> parent 1: classid 1:2 htb rate 10Gbit prio 7
创建具有相同优先级和不同配额的 tc 类
# tc class add dev <interface> parent 1: classid 1:1 htb rate 10Gbit prio 2 quantum 409600 # tc class add dev <interface> parent 1: classid 1:2 htb rate 10Gbit prio 2 quantum 188416 # tc class add dev <interface> parent 1: classid 1:3 htb rate 10Gbit prio 2 quantum 32768
RVU 表示器¶
RVU 表示器驱动程序增加了对系统中 RVU PF 的 VF 创建表示器设备的支持。当用户启用 switchdev 模式时,将创建表示器设备。可以在设置 SRIOV numVFs 之前或之后启用 switchdev 模式。所有表示器设备共享一个 NIXLF,但每个设备都有专用的 Rx/Tx 队列。RVU PF 表示器驱动程序为每个 Rx/Tx 队列对注册一个单独的 netdev。
当前的硬件不支持内置交换机,该交换机可以执行 L2 学习并在被表示者和表示器之间转发数据包。因此,被表示者及其表示器之间的数据包路径是通过设置适当的 NPC MCAM 过滤器来实现的。匹配这些过滤器的传输数据包将通过硬件环回通道/接口(即,而不是将它们发送到 MAC 接口之外)进行环回。这将再次匹配已安装的过滤器,并将其转发。通过这种方式,实现了被表示者 => 表示器和表示器 => 被表示者的数据包路径。这些规则在创建表示器时安装,并根据表示器/被表示者接口状态激活/停用。
使用示例
将设备更改为 switchdev 模式
# devlink dev eswitch set pci/0002:1c:00.0 mode switchdev系统上的表示器设备列表
# ip link show Rpf1vf0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether f6:43:83:ee:26:21 brd ff:ff:ff:ff:ff:ff Rpf1vf1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 12:b2:54:0e:24:54 brd ff:ff:ff:ff:ff:ff Rpf1vf2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 4a:12:c4:4c:32:62 brd ff:ff:ff:ff:ff:ff Rpf1vf3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether ca:cb:68:0e:e2:6e brd ff:ff:ff:ff:ff:ff Rpf2vf0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 06:cc:ad:b4:f0:93 brd ff:ff:ff:ff:ff:ff
要从系统中删除表示器设备。将设备更改为传统模式。
将设备更改为传统模式
# devlink dev eswitch set pci/0002:1c:00.0 mode legacy
可以使用 devlink 端口管理 RVU 表示器(请参阅 Documentation/networking/devlink/devlink-port.rst) 接口。
显示表示器的 devlink 端口
# devlink port pci/0002:1c:00.0/0: type eth netdev Rpf1vf0 flavour physical port 0 splittable false pci/0002:1c:00.0/1: type eth netdev Rpf1vf1 flavour pcivf controller 0 pfnum 1 vfnum 1 external false splittable false pci/0002:1c:00.0/2: type eth netdev Rpf1vf2 flavour pcivf controller 0 pfnum 1 vfnum 2 external false splittable false pci/0002:1c:00.0/3: type eth netdev Rpf1vf3 flavour pcivf controller 0 pfnum 1 vfnum 3 external false splittable false
功能属性¶
RVU 表示器支持表示器的功能属性。通过 devlink eswitch 端口支持表示器的端口功能配置。
MAC 地址设置¶
RVU 表示器驱动程序支持 devlink 端口功能属性机制来设置 MAC 地址。(请参考 Devlink 端口)
为端口 2 设置 MAC 地址
# devlink port function set pci/0002:1c:00.0/2 hw_addr 5c:a1:1b:5e:43:11 # devlink port show pci/0002:1c:00.0/2 pci/0002:1c:00.0/2: type eth netdev Rpf1vf2 flavour pcivf controller 0 pfnum 1 vfnum 2 external false splittable false function: hw_addr 5c:a1:1b:5e:43:11
TC 卸载¶
rvu 表示器驱动程序实现使用端口表示器卸载 tc 规则的支持。
丢弃 VLAN ID 为 3 的数据包
# tc filter add dev Rpf1vf0 protocol 802.1Q parent ffff: flower vlan_id 3 vlan_ethtype ipv4 skip_sw action drop将 VLAN ID 为 5 且 IPv4 的数据包重定向到 eth1,并在剥离 VLAN 标头后进行。
# tc filter add dev Rpf1vf0 ingress protocol 802.1Q flower vlan_id 5 vlan_ethtype ipv4 skip_sw action vlan pop action mirred ingress redirect dev eth1