Onload / TCPDirect¶
[高速版] 限定
本章僅適用於 [高速版](搭配 Solarflare NIC)。[通用版] 請略過。
下載¶
前往 AMD 官方下載頁面,選擇對應 NIC 型號:
需下載的 ZIP 套件:
- OpenOnload SRPM Release Package(
SF-*-OpenOnload-SRPM-Release-Package.zip) - TCPDirect SRPM Release Package(
XN-*-TCPDirect-SRPM-Release-Package.zip) - 僅 X3522:Alveo X3522 NET driver SRPM(
XN-*-Alveo-X3522-NET-driver-source-RPM-package.zip)
Onload 與 TCPDirect 版本號各自獨立,需確認彼此相容(同一批次發布的版本通常配套)。
X3522 不需要 Auxiliary bus driver SRPM
AMD 同頁會列出 XN-*-Auxiliary-bus-driver-source-RPM-package.zip。這份是給沒有原生 aux bus 的舊 kernel(< 5.11)用的 backport,RHEL 9(kernel 5.14)已內建,不要下載。其 spec 偵測到 /sys/bus/auxiliary 已存在會直接 fail。
安裝¶
步驟一:解壓縮¶
unzip SF-*-OpenOnload-SRPM-Release-Package.zip
unzip XN-*-TCPDirect-SRPM-Release-Package.zip
# 僅 X3522:
unzip XN-*-Alveo-X3522-NET-driver-source-RPM-package.zip
步驟二(僅 X3522):建置並安裝 xilinx-efct kmod¶
X3522 的 NIC driver 與 Onload 是分開出貨的。必須在 build Onload 之前先把 xilinx-efct kmod 裝起來——它會把 xlnx_efct.h header 灑到 /lib/modules/$(uname -r)/build/include/linux/net/xilinx/,後續 Onload build 才偵測得到 X3 支援。
rpmbuild --rebuild ./xilinx-efct-*.src.rpm
sudo dnf install -y \
~/rpmbuild/RPMS/x86_64/kernel-module-xilinx-efct-*.rpm
sudo modprobe xilinx_efct
驗證 driver bind 成功:
lspci -v -s <NIC PCI ID> | grep 'Kernel driver'
# → Kernel driver in use: xilinx_efct
ethtool -i <介面名稱>
# → driver: xilinx_efct
X2522 部署請略過此步驟。
步驟三:建置 Onload(含 devel)¶
TCPDirect 編譯時依賴 openonload 與 openonload-devel,必須先完成此步驟。
建置:
必須加 --define "have_efct 1",強制把 X3 (EFCT) 支援 link 進 sfc_resource.ko。
不加 have_efct 1 的後果
Onload SRPM 預設是「找得到 xilinx-efct header 才開 EFCT」,但偵測偶爾會靜悄悄失敗——build 不報錯,產出的 sfc_resource.ko 卻完全沒有 X3 aux match table,onload 載入後 sfc_resource 看不到 X3522,所有 socket 會 fallback 回 kernel network stack。have_efct 1 強制要求 EFCT 必須能 build 進去,找不到 header 就 fail(fail fast 比 silently broken 好)。
建置完成後確認產出:
ls ~/rpmbuild/RPMS/x86_64/
# onload-<version>.el9.x86_64.rpm
# onload-kmod-<kernel>-<version>.el9.x86_64.rpm
ls ~/rpmbuild/RPMS/noarch/
# onload-devel-<version>.el9.noarch.rpm ← TCPDirect 需要這個
步驟四:安裝 Onload¶
sudo rpm -i \
~/rpmbuild/RPMS/x86_64/onload-<version>.el9.x86_64.rpm \
~/rpmbuild/RPMS/x86_64/onload-kmod-*.rpm \
~/rpmbuild/RPMS/noarch/onload-devel-<version>.el9.noarch.rpm
不要用 x86_64/*.rpm glob 帶過
onload-devel 在 noarch/ 目錄下,若只安裝 x86_64/*.rpm,
devel 套件不會被裝到,後續 TCPDirect 的 rpmbuild 仍會失敗。
kernel 版本不完全吻合
kmod 套件以 build 時的 kernel 版本命名,安裝時若執行中的 kernel 版本不同,
安裝程式會自動做相容性確認(Module *.ko from kernel X is compatible with kernel Y)。
看到此訊息屬正常,不影響使用。
步驟五:建置並安裝 TCPDirect¶
rpmbuild --rebuild ./tcpdirect-*.src.rpm
sudo rpm -i ~/rpmbuild/RPMS/x86_64/tcpdirect-<version>.x86_64.rpm
驗證¶
X3522 額外驗證 sfc_resource 真的有 link X3 支援:
# 應出現一行 alias 配對 X3 aux device(沒這行表示 have_efct 沒帶到)
modinfo sfc_resource | grep auxiliary:xilinx_efct.efct
# → alias: auxiliary:xilinx_efct.efct
# 應列出 4 個 X3522 介面(quad-port)
sudo ls /sys/kernel/debug/sfc_resource/nics/
# → 000_<介面1> 001_<介面2> 002_<介面3> 003_<介面4>
# onload stack 上實際 bind 到 X3 efct VI
sudo onload --profile=latency sleep 5 &
sudo onload_stackdump lots | grep 'dev=xilinx_efct'
# → ci_netif_dump_vi: stack=N intf=0 dev=xilinx_efct.efct.0 hw=...
確認使用 release build
TCPDirect 預設安裝 debug build,效能會差數倍。執行以下指令確認:
確認輸出不包含 /zf/debug/ 路徑。
排錯¶
-
rpmbuild --rebuild tcpdirect-*.src.rpm報Failed build dependencies: openonload / openonload-devel→ 步驟三漏了--with devel,或步驟四沒裝到noarch/onload-devel-*.rpm。 確認:rpm -q --provides onload-devel,若無輸出,補裝 noarch 的 devel RPM 後重試。 -
onload --version找不到指令 → 未執行scripts/onload_install,回到步驟五補執行 -
重開機後 kernel module 消失 → kernel 升級後需重新安裝對應版本的 kmod,重新執行步驟二、三、四
-
X3522:
onload_tool reload後,/sys/kernel/debug/sfc_resource/nics/沒看到 X3 介面 →modinfo sfc_resource | grep auxiliary:xilinx_efct.efct確認;若空白,表示步驟三 build 時沒帶--define "have_efct 1",或建置時 xilinx-efct kmod 還沒裝(步驟二沒做)。回到步驟二、三重做。 -
X3522:
sfboot報The AMD Solarflare network adapter driver (sfc) is not loaded→ 預期行為,X3522 走xilinx_efctdriver 不吃sfboot。改用ethtool -i與devlink dev info查看資訊,詳見 Solarflare / Alveo NIC 設定 → X3522。