QorIQ DPAA 以太网驱动程序¶
作者: - Madalin Bucur <madalin.bucur@nxp.com> - Camelia Groza <camelia.groza@nxp.com>
DPAA 以太网概述¶
DPAA 是数据路径加速架构(Data Path Acceleration Architecture)的缩写,它是一组可在多代 SoC(包括 PowerPC 和 ARM64)上使用的网络加速 IP。
飞思卡尔 DPAA 架构由一系列支持以太网连接的硬件模块组成。该以太网驱动程序依赖于 Linux 内核中的以下驱动程序:
- 外设访问存储单元 (PAMU) (* 仅适用于 PPC 平台)
drivers/iommu/fsl_*
- 帧管理器 (FMan)
drivers/net/ethernet/freescale/fman
- 队列管理器 (QMan),缓冲区管理器 (BMan)
drivers/soc/fsl/qbman
dpaa_eth 接口映射到 FMan MAC 的简化视图
dpaa_eth /eth0\ ... /ethN\
driver | | | |
------------- ---- ----------- ---- -------------
-Ports / Tx Rx \ ... / Tx Rx \
FMan | | | |
-MACs | MAC0 | | MACN |
/ dtsec0 \ ... / dtsecN \ (or tgec)
/ \ / \(or memac)
--------- -------------- --- -------------- ---------
FMan, FMan Port, FMan SP, FMan MURAM drivers
---------------------------------------------------------
FMan HW blocks: MURAM, MACs, Ports, SP
---------------------------------------------------------
dpaa_eth 与 QMan、BMan 和 FMan 的关系
________________________________
dpaa_eth / eth0 \
driver / \
--------- -^- -^- -^- --- ---------
QMan driver / \ / \ / \ \ / | BMan |
|Rx | |Rx | |Tx | |Tx | | driver |
--------- |Dfl| |Err| |Cnf| |FQs| | |
QMan HW |FQ | |FQ | |FQs| | | | |
/ \ / \ / \ \ / | |
--------- --- --- --- -v- ---------
| FMan QMI | |
| FMan HW FMan BMI | BMan HW |
----------------------- --------
以上(和代码中)使用的缩略语为:
DPAA |
数据路径加速架构 |
FMan |
DPAA 帧管理器 |
QMan |
DPAA 队列管理器 |
BMan |
DPAA 缓冲区管理器 |
QMI |
FMan 中的 QMan 接口 |
BMI |
FMan 中的 BMan 接口 |
FMan SP |
FMan 存储配置文件 |
MURAM |
FMan 中的多用户 RAM |
FQ |
QMan 帧队列 |
Rx Dfl FQ |
默认接收 FQ |
Rx Err FQ |
Rx 错误帧 FQ |
Tx Cnf FQ |
Tx 确认 FQ |
Tx FQs |
传输帧队列 |
dtsec |
数据通路三速以太网控制器 (10/100/1000 Mbps) |
tgec |
万兆以太网控制器 (10 Gbps) |
memac |
多速率以太网 MAC (10/100/1000/10000) |
DPAA 以太网支持的 SoC¶
DPAA 驱动程序支持以下 SoC 上存在的以太网控制器:
PPC - P1023 - P2041 - P3041 - P4080 - P5020 - P5040 - T1023 - T1024 - T1040 - T1042 - T2080 - T4240 - B4860
ARM - LS1043A - LS1046A
在内核中配置 DPAA 以太网¶
要启用 DPAA 以太网驱动程序,需要以下 Kconfig 选项:
# common for arch/arm64 and arch/powerpc platforms
CONFIG_FSL_DPAA=y
CONFIG_FSL_FMAN=y
CONFIG_FSL_DPAA_ETH=y
CONFIG_FSL_XGMAC_MDIO=y
# for arch/powerpc only
CONFIG_FSL_PAMU=y
# common options needed for the PHYs used on the RDBs
CONFIG_VITESSE_PHY=y
CONFIG_REALTEK_PHY=y
CONFIG_AQUANTIA_PHY=y
DPAA 以太网帧处理¶
在接收端 (Rx),传入帧的缓冲区从专用接口缓冲区池中获取。驱动程序初始化并用单页缓冲区填充这些缓冲区。
在传输端 (Tx),所有传输的帧都通过 Tx 确认帧队列返回给驱动程序。然后驱动程序负责释放缓冲区。为了正确地做到这一点,在传输之前会向缓冲区添加一个指回 skb 的反向指针。当缓冲区通过确认 FQ 返回到驱动程序时,skb 可以被正确消耗。
DPAA 以太网功能¶
目前,DPAA 以太网驱动程序支持 Linux 以太网驱动程序所需的基本功能。对高级功能的支持将逐步添加。
该驱动程序支持 UDP 和 TCP 的接收 (Rx) 和发送 (Tx) 校验和卸载。目前,Rx 校验和卸载功能默认启用,无法通过 ethtool 控制。此外,还添加了 rx-flow-hash 和 rx-hashing。RSS 的加入为转发场景提供了巨大的性能提升,允许一个接口接收到的不同流量流由不同的 CPU 并行处理。
该驱动程序支持多个优先级 Tx 流量类别。优先级范围从 0(最低)到 3(最高)。这些被映射到具有严格优先级级别的硬件工作队列。每个流量类别包含 NR_CPU TX 队列。默认情况下,只启用一个流量类别并使用最低优先级的 Tx 队列。可以使用 mqprio qdisc 启用更高优先级的流量类别。例如,使用以下命令在接口上启用所有四个流量类别。此外,skb 优先级级别映射到流量类别如下:
优先级 0 到 3 - 流量类别 0 (低优先级)
优先级 4 到 7 - 流量类别 1 (中低优先级)
优先级 8 到 11 - 流量类别 2 (中高优先级)
优先级 12 到 15 - 流量类别 3 (高优先级)
tc qdisc add dev <int> root handle 1: \
mqprio num_tc 4 map 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 hw 1
DPAA IRQ 亲和性与接收侧扩展¶
DPAA Rx 队列或 DPAA Tx 确认队列上的流量被 CPU 视为某个端口上的入站流量。DPAA QMan 端口中断各自绑定到一个特定的 CPU。同一个端口中断服务于所有 QMan 端口消费者。
默认情况下,DPAA 以太网驱动程序启用 RSS,利用 DPAA FMan 解析器和 Keygen 模块,通过对接收帧中存在的 IPv4/v6 源和目标以及 L4 源和目标端口进行哈希,将流量分发到 128 个硬件帧队列。当 RSS 被禁用时,特定接口接收到的所有流量都将通过默认的 Rx 帧队列接收。默认的 DPAA Rx 帧队列配置为将接收到的流量放入一个池通道,允许任何可用的 CPU 端口出队入站流量。默认帧队列设置了 HOLDACTIVE 选项,确保来自特定队列的流量突发由同一 CPU 处理。这确保了非常低的帧乱序率。缺点是,当 RSS 未启用时,每次只有一个 CPU 可以处理特定接口接收到的流量。
为了实现 RSS,DPAA 以太网驱动程序额外分配了一组 128 个 Rx 帧队列,这些队列以循环方式配置到专用通道。帧队列到 CPU 的映射现在是硬编码的,没有间接表来将特定 FQ(哈希结果)的流量移动到另一个 CPU。到达这些帧队列之一的入站流量将到达相同的端口,并且将始终由相同的 CPU 处理。这确保了流内顺序的保持和多个流量流的工作负载分布。
可以使用 ethtool 关闭特定接口的 RSS,例如:
# ethtool -N fm1-mac9 rx-flow-hash tcp4 ""
要重新开启它,需要为 tcp4/6 或 udp4/6 设置 rx-flow-hash
# ethtool -N fm1-mac9 rx-flow-hash udp4 sfdn
对于单个协议没有独立的控制,为 tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 之一运行的任何命令都将控制该接口上所有协议的 rx-flow-hashing。
除了使用 FMan Keygen 计算的哈希值将流量分散到 128 个 Rx FQ 上之外,当 NETIF_F_RXHASH 功能开启时(默认活动),DPAA 以太网驱动程序还会设置 skb 哈希值。这可以通过 ethtool 开启或关闭,例如:
# ethtool -K fm1-mac9 rx-hashing off
# ethtool -k fm1-mac9 | grep hash
receive-hashing: off
# ethtool -K fm1-mac9 rx-hashing on
Actual changes:
receive-hashing: on
# ethtool -k fm1-mac9 | grep hash
receive-hashing: on
请注意,Rx 哈希依赖于该接口的 rx-flow-hashing 是否开启——关闭 rx-flow-hashing 也会禁用 rx-hashing(ethtool 不会报告其已关闭,因为这取决于 NETIF_F_RXHASH 功能标志)。
调试¶
通过 ethtool 为每个接口导出以下统计信息:
每个 CPU 的中断计数
每个 CPU 的接收包计数
每个 CPU 的发送包计数
每个 CPU 的 Tx 确认包计数
每个 CPU 的 Tx S/G 帧计数
每个 CPU 的 Tx 错误计数
每个 CPU 的 Rx 错误计数
每种类型的 Rx 错误计数
拥塞相关统计信息
拥塞状态
处于拥塞状态的时间
设备进入拥塞状态的次数
每种原因的丢包计数
驱动程序还在 sysfs 中导出以下信息:
每种 FQ 类型的 FQ ID:/sys/devices/platform/soc/<addr>.fman/<addr>.ethernet/dpaa-ethernet.<id>/net/fm<nr>-mac<nr>/fqids
正在使用的缓冲区池 ID:/sys/devices/platform/soc/<addr>.fman/<addr>.ethernet/dpaa-ethernet.<id>/net/fm<nr>-mac<nr>/bpids