2017-06-22 196 views
0

我是在內核模塊中使用rdma(ib_verbs)實驗項目的新手。我從krping那裏得到了示例代碼並修改了它。該系統在64位Linux Centos上運行,具有需要禁用透明大頁面的自定義3.10 Linux內核。 我想要一個大型(4GB)的RDMA讀/寫空間,它不必連續,因爲我很可能從遠程方(隨機訪問)一次最多寫入/讀取最多1MB。在Linux內核模塊中爲RDMA註冊大緩衝區

問:

  1. 我應該只是做4MB的kmalloc的一千倍並註冊DMA區域?它有多糟糕,設計明智的分配使用kmalloc而不是vmalloc的大內存塊?我聽說不應該這樣做,並且只能通過vmalloc檢索大內存。但是來自vmalloc的地址對DMA來說並不好。
  2. 如果沒有,那麼有一個4GB緩衝區可以從遠程方隨機訪問的好替代方法是什麼?
  3. 用戶空間rdma如何管理這種緩衝區?我記得我只有malloc 4GB的內存並且調用了ibv_reg_mr並且它已經可以使用了。

回答

0

只要您沒有使用覆蓋整個物理內存的內存(不建議用於寫入啓用的MR),則應該使用IB_WR_REG_MR工作請求來註冊您的內存區域。爲此,您可以使用接受散佈列表和頁面大小的ib_map_mr_sg函數。因此,基本上,您可以註冊一個由您選擇的固定大小的塊構建的MR。

這裏有一個權衡:使用小分配大小將允許內核在碎片化的系統上更容易地找到空閒內存,但另一方面可能會降低性能,因爲它會增加NIC的IOTLB負載。

用戶空間通過調用get_user_pages並使用系統的頁面大小(通常爲4kb)來處理大型MR註冊。儘管有些驅動程序在內部嘗試和檢測較大的頁面大小時進行了優化,但用戶空間內存恰好符合這種方式。