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 可以由主机内核本身使用,也可以连接到 VM 或用户空间应用程序(如 DPDK 等)。 因此,AF 必须处理来自任何域的任何设备发送的配置/配置请求。
- AF 驱动程序还与底层固件交互以
管理物理以太网链路,即 CGX LMAC。
检索速度、双工、自动协商等信息
检索 PHY EEPROM 和统计信息。
配置 FEC、PAM 模式
等
- 从纯网络方面来看,AF 驱动程序支持以下功能。
将物理链路映射到已注册 netdev 的 RVU PF。
将 NIX 和 NPA 块 LF 连接到 RVU PF/VF,后者为常规网络功能提供缓冲区池、RQ、SQ。
流控制(暂停帧)启用/禁用/配置。
HW PTP 时间戳相关配置。
NPC 解析器配置文件,基本上是如何解析 pkt 以及要提取什么信息。
NPC 提取配置文件,从 pkt 中提取什么以匹配 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:VF 与其父 SR-IOV PF 共享物理链路,以及使用内部 HW 环回通道 (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 在它们之间进行通信,而无需将流量发送到外部。 HW 中没有交换机,因此支持环回 VF。
这些通过 mbox 直接与 AF (PF0) 通信。
除了用于数据包接收和传输的 IO 通道或链路之外,这些 VF 类型之间没有其他区别。 AF 驱动程序负责 IO 通道映射,因此相同的 VF 驱动程序适用于两种类型的设备。
基本数据包流¶
入口¶
CGX LMAC 接收数据包。
将数据包转发到 NIX 块。
然后提交到 NPC 块进行解析,然后进行 MCAM 查找以获取目标 RVU 设备。
连接到目标 RVU 设备的 NIX LF 从 NPA 块 LF 的 RQ 映射缓冲区池中分配一个缓冲区。
RQ 可以通过 RSS 选择,也可以通过使用 RQ 编号配置 MCAM 规则来选择。
数据包已 DMA,并且驱动程序已收到通知。
出口¶
驱动程序准备发送描述符并提交到 SQ 以进行传输。
SQ 已经过配置(由 AF)以在特定链路/通道上传输。
SQ 描述符环保存在从 NPA 块 LF 的 SQ 映射池中分配的缓冲区中。
NIX 块在指定的通道上传输 pkt。
可以安装 NPC MCAM 条目以将 pkt 分流到不同的通道上。
Devlink 健康报告器¶
NPA 报告器¶
NPA 报告器负责报告和恢复以下错误组
GENERAL 事件
由于未映射 PF 的操作而导致的错误。
由于禁用了其他硬件块(NIX、SSO、TIM、DPI 和 AURA)的分配/释放而导致的错误。
ERROR 事件
由于读取 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 报告器负责报告和恢复以下错误组
GENERAL 事件
由于缓冲区不足而导致接收镜像/多播数据包丢弃。
SMQ 刷新操作。
ERROR 事件
由于从多播/镜像缓冲区读取/写入 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。
当前 HW 不支持内置交换机,该交换机可以执行 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