我正在尝试为HPC工作负载分配DMA缓冲区。它需要64GB的缓冲空间。在计算之间,一些数据被卸载到PCIe卡。我不想将数据复制到由pci_alloc_consistent给出的一堆小小的4MB缓冲区中,我只想创建64个1GB缓冲区,由1GB HugePages支持。如何在Linux内核模块中分配由1GB HugePages支持的DMA缓冲区?
一些背景资料: 内核版本:CentOS的6.4/2.6.32-358.el6.x86_64 内核引导选项:hugepagesz =1克大页面= 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)的连续物理内存作为内核缓冲区?
有趣的问题,你的目标主要是为了避免内核和用户空间之间的复制? – ChuckCottrill
所有这些API都是针对用户空间的。看看如何实现hugetlbfs,尤其是'hugetlbfs_file_mmap'。 –
@muusbolla你能找到答案吗? –