如何在Linux内核模块中分配1GB HugePages支持的DMA缓冲区?
我正在尝试为HPC工作负载分配DMA缓冲区.它需要64GB的缓冲空间.在计算之间,一些数据被卸载到PCIe卡.我不想将数据复制到pci_alloc_consistent给出的一堆极小的4MB缓冲区中,而是想创建64个1GB缓冲区,由1GB HugePages支持.
一些背景信息: / proc / meminfo的相关部分: 我可以挂载-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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |