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

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

概述我正在尝试为HPC工作负载分配DMA缓冲区.它需要64GB的缓冲空间.在计算之间,一些数据被卸载到PCIe卡.我不想将数据复制到pci_alloc_consistent给出的一堆极小的4MB缓冲区中,而是想创建64个1GB缓冲区,由1GB HugePages支持. 一些背景信息: 内核版本:CentOS 6.4 / 2.6.32-358.el6.x86_64 内核启动选项:hugepagesz = 我正在尝试为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.

总结

以上是内存溢出为你收集整理的如何在Linux内核模块中分配1GB HugePages支持的DMA缓冲区?全部内容,希望文章能够帮你解决如何在Linux内核模块中分配1GB HugePages支持的DMA缓冲区?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1039874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存