如何在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.

相关文章

1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...
1 删除0字节文件 find -type f -size 0 -exec rm -rf {} ...
## 步骤 1:安装必要的软件包 首先,需要确保系统已安装 `dh...