在Linux内核模块中为RDMA注册大缓冲区

时间:2017-06-22 22:21:44

标签: kernel-module rdma

我是一个在内核模块中使用rdma(ib_verbs)试验项目的新手。我从krping获得了示例代码并修改了它。该系统在64位Linux Centos上运行,具有自定义3.10 Linux内核,需要禁用透明大页面。 我想要一个大的(4GB以上)RDMA可读/写空间,它不一定是连续的,因为我最有可能一次从远程方(随机访问)写入/读取最多1MB。

问题:

  1. 我应该只做千倍的4MB kmalloc并注册DMA区域吗?有多糟糕,使用kmalloc而不是vmalloc分配大量内存设计明智吗?我听说不应该这样做,大内存只能通过vmalloc检索。但是来自vmalloc的地址对DMA来说并不好。
  2. 如果没有,那么什么是一个很好的替代方式,可以从远程方随机访问4GB缓冲区?
  3. 用户空间rdma如何管理这种缓冲区?我记得我只使用了4GB的内存并调用了ibv_reg_mr,它已经可以使用了。

1 个答案:

答案 0 :(得分:0)

只要您不使用覆盖整个物理内存的内存(不建议使用支持写入的MR),您应该使用IB_WR_REG_MR工作请求注册您的内存记忆区域。为此,您将使用接受散点列表和页面大小的ib_map_mr_sg函数。所以基本上,你可以注册一个用你选择的固定大小的块构建的MR。

这里有一个权衡:使用小的分配大小将允许内核在分散的系统上更容易找到空闲内存,但另一方面它可能会降低性能,因为它会增加NIC上的负载。 IOTLB。

用户空间通过调用get_user_pages并使用系统的页面大小(通常为4kb)来处理大型MR注册。虽然某些驱动程序在内部尝试检测更大的页面大小时有优化,但如果用户空间内存恰好以这种方式对齐。