我正在尝试为 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_Free:64 HugePages_Rsvd:0 HugePages_Surp:0 Hugepagesize: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)连续物理内存作为内核缓冲区的方法吗?