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