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

问题描述:

我是在内核模块中使用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并且它已经可以使用了。

只要您没有使用覆盖整个物理内存的内存(不建议用于写入启用的MR),则应该使用IB_WR_REG_MR工作请求来注册您的内存区域。为此,您可以使用接受散布列表和页面大小的ib_map_mr_sg函数。因此,基本上,您可以注册一个由您选择的固定大小的块构建的MR。

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

用户空间通过调用get_user_pages并使用系统的页面大小(通常为4kb)来处理大型MR注册。尽管有些驱动程序在内部尝试和检测较大的页面大小时进行了优化,但用户空间内存恰好符合这种方式。