微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Linux内核模块中分配1GB HugePages支持的DMA缓冲区?

我正在尝试为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为true. MAP_HUGETLB已定义.

我已经阅读了一些关于使用libhugetlbfs在用户空间中调用get_huge_pages()的信息,但理想情况下,这个缓冲区将在内核空间中分配.我尝试用MAP_HUGETLB调用do_mmap(),但它似乎没有改变自由大页面数量,所以我认为它实际上并没有用大页面支持mmap.

所以我想我得到的是,有什么方法可以将缓冲区映射到内核空间中的1GB HugePage,还是必须在用户空间中完成?或者,如果有人知道任何其他方式,我可以获得一个巨大的(1-64GB)数量的连续物理内存可用作内核缓冲区?

解决方法

这在内核空间中并不常见,因此没有太多示例.

就像任何其他页面一样,大页面分配了alloc_pages,调整到:

struct page *p = alloc_pages(GFP_TRANSHUGE,HPAGE_PMD_ORDER);

HPAGE_PMD_ORDER是一个宏,根据普通页面定义单个巨大页面的顺序.以上暗示在内核中启用了透明的大页面.

然后,您可以使用kmap()以通常的方式继续映射获取页面指针.

免责声明:我自己从未尝试过,所以你可能需要做一些实验.要检查的一件事是:HPAGE_PMD_SHIFT表示较小“巨大”页面的顺序.如果你想使用那些巨大的1GB页面,你可能需要尝试不同的顺序,可能是PUD_SHIFT – PAGE_SHIFT.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐