跳轉到

Onload / TCPDirect

[高速版] 限定

本章僅適用於 [高速版](搭配 Solarflare NIC)。[通用版] 請略過。

下載

前往 AMD 官方下載頁面,選擇對應 NIC 型號:

需下載的 ZIP 套件:

  • OpenOnload SRPM Release PackageSF-*-OpenOnload-SRPM-Release-Package.zip
  • TCPDirect SRPM Release PackageXN-*-TCPDirect-SRPM-Release-Package.zip
  • 僅 X3522:Alveo X3522 NET driver SRPMXN-*-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 編譯時依賴 openonloadopenonload-devel,必須先完成此步驟。

rpm -ivh ./onload-*.src.rpm

建置:

rpmbuild -ba --with devel ~/rpmbuild/SPECS/openonload.spec

必須加 --define "have_efct 1",強制把 X3 (EFCT) 支援 link 進 sfc_resource.ko

rpmbuild -ba --with devel \
  --define "have_efct 1" \
  ~/rpmbuild/SPECS/openonload.spec

不加 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-develnoarch/ 目錄下,若只安裝 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

驗證

onload --version
lsmod | grep onload

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,效能會差數倍。執行以下指令確認:

tapioctl check tcpdirect

確認輸出不包含 /zf/debug/ 路徑。

排錯

  • rpmbuild --rebuild tcpdirect-*.src.rpmFailed 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:sfbootThe AMD Solarflare network adapter driver (sfc) is not loaded → 預期行為,X3522 走 xilinx_efct driver 不吃 sfboot。改用 ethtool -idevlink dev info 查看資訊,詳見 Solarflare / Alveo NIC 設定 → X3522