使用者空間 Verbs 訪問¶
透過啟用 CONFIG_INFINIBAND_USER_VERBS 構建的 ib_uverbs 模組,允許使用者空間透過“verbs”直接訪問 IB 硬體,如 InfiniBand 體系結構規範第 11 章所述。
要使用 verbs,需要 libibverbs 庫,可從 https://github.com/linux-rdma/rdma-core 獲取。 libibverbs 包含一個與裝置無關的 API,用於使用 ib_uverbs 介面。 libibverbs 還需要適用於您的 InfiniBand 硬體的、適當的裝置相關的核心和使用者空間驅動程式。 例如,要使用 Mellanox HCA,您需要安裝 ib_mthca 核心模組和 libmthca 使用者空間驅動程式。
使用者-核心通訊¶
使用者空間透過 /dev/infiniband/uverbsN 字元裝置與核心進行慢速路徑、資源管理操作通訊。 快速路徑操作通常透過直接寫入 mmap() 到使用者空間的硬體暫存器來執行,而無需系統呼叫或上下文切換到核心。
命令透過對這些裝置檔案進行 write() 操作傳送到核心。 ABI 在 drivers/infiniband/include/ib_user_verbs.h 中定義。 需要核心響應的命令的結構包含一個 64 位欄位,用於傳遞指向輸出緩衝區的指標。 狀態作為 write() 系統呼叫的返回值返回到使用者空間。
資源管理¶
由於所有 IB 資源的建立和銷燬都是透過傳遞到檔案描述符的命令完成的,因此核心可以跟蹤哪些資源附加到給定的使用者空間上下文。 ib_uverbs 模組維護 idr 表,用於在核心指標和不透明的使用者空間控制代碼之間進行轉換,因此核心指標永遠不會暴露給使用者空間,並且使用者空間無法欺騙核心以跟蹤偽造的指標。
這也允許核心在程序退出時進行清理,並防止一個程序接觸另一個程序的資源。
記憶體鎖定¶
直接使用者空間 I/O 要求作為潛在 I/O 目標的記憶體區域保持在相同的物理地址。 ib_uverbs 模組透過 get_user_pages() 和 put_page() 呼叫來管理記憶體區域的鎖定和解鎖。 它還計算程序的 pinned_vm 中鎖定的記憶體量,並檢查非特權程序是否超過其 RLIMIT_MEMLOCK 限制。
多次鎖定的頁面每次鎖定都會被計數,因此 pinned_vm 的值可能高估了程序鎖定的頁面數。
/dev 檔案¶
要使用 udev 自動建立適當的字元裝置檔案,可以使用如下規則:
KERNEL=="uverbs*", NAME="infiniband/%k"這將建立名為
/dev/infiniband/uverbs0等等的裝置節點。 由於 InfiniBand 使用者空間 verbs 應該可以安全地供非特權程序使用,因此向 udev 規則新增適當的 MODE 或 GROUP 可能很有用。