【发布时间】:2013-10-27 22:33:02
【问题描述】:
我正在尝试为 HPC 工作负载分配 DMA 缓冲区。它需要 64GB 的缓冲区空间。在计算之间,一些数据被卸载到 PCIe 卡上。我不想将数据复制到 pci_alloc_consistent 给定的一堆 4MB 缓冲区,而是创建 64 个 1GB 缓冲区,由 1GB HugePages 支持。
一些背景信息: 内核版本:CentOS 6.4 / 2.6.32-358.el6.x86_64 内核启动选项:hugepagesz=1g hugepages=64 default_hugepagesz=1g
/proc/meminfo 的相关部分: AnonHugePages:0 kB HugePages_Total:64 HugePages_免费:64 HugePages_Rsvd:0 HugePages_Surp: 0 巨页大小:1048576 kB DirectMap4k:848 kB DirectMap2M:2062336 kB DirectMap1G:132120576 kB
我可以挂载 -t hugetlbfs nodev /mnt/hugepages。 CONFIG_HUGETLB_PAGE 为真。 MAP_HUGETLB 已定义。
我已经阅读了一些关于在用户空间中使用 libhugetlbfs 调用 get_huge_pages() 的信息,但理想情况下,该缓冲区将分配在内核空间中。我尝试使用 MAP_HUGETLB 调用 do_mmap() ,但它似乎并没有改变空闲大页面的数量,所以我认为它实际上并没有支持带有大页面的 mmap。
所以我猜我在说什么,有没有任何方法可以将缓冲区映射到内核空间中的 1GB HugePage,还是必须在用户空间中完成?或者,如果有人知道我可以获得大量(1-64GB)连续物理内存作为内核缓冲区的其他方式吗?
【问题讨论】:
-
有趣的问题,你的目标主要是避免内核和用户空间之间的复制吗?
-
所有这些 API 都是针对用户空间的。看看hugetlbfs是怎么实现的,尤其是
hugetlbfs_file_mmap。 -
@muusbolla 你能找到答案吗?
-
CL.,谢谢,hugetlbfs_file_mmap的定义在这里linux/fs/hugetlbfs/inode.c:lxr.free-electrons.com/source/fs/hugetlbfs/inode.c?v=3.18#L100
-
@ChuckCottrill 是的,目标是在移动大量数据时获得最大性能。因此需要使用可以由设备和用户代码直接读取和访问的巨大的静态 DMA 缓冲区。
标签: c linux linux-kernel dma huge-pages