0

我是一个新手,在内核模块中使用 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 如何管理这种缓冲区?我记得我只 malloc 4GB 的内存并调用 ibv_reg_mr 并且它可以使用了。
4

1 回答 1

0

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

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

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

于 2017-06-25T05:01:57.683 回答