内核驱动分配2Mb大页后Huge_pages_free无变化问题咨询
内核态分配预分配大页的问题解析
你遇到的核心问题是混淆了透明大页(THP)和预分配静态大页两种机制:
- 你使用的
kmalloc(0x200000, GFP_KERNEL | __GFP_COMP)和alloc_pages(GFP_TRANSHUGE, HPAGE_PMD_ORDER)申请的是透明大页,这类大页由内核动态管理,无需提前预分配,/proc/meminfo中对应的统计项是AnonHugePages,而非HugePages_Free。 /proc/meminfo里的HugePages_Free统计的是预分配静态大页,这类大页需要提前通过用户态预留,且必须使用专门的API申请。
正确分配预分配静态大页的方法
如果目标是使用预分配的2MB大页,需按以下步骤操作:
1. 提前预分配大页(用户态)
通过sysfs接口预留大页,例如预分配10个2MB大页:
echo 10 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
执行后查看/proc/meminfo | grep Huge,会看到HugePages_Total变为10,HugePages_Free为10。
2. 内核态分配代码
使用hugetlb_alloc_pages()接口申请预分配的大页,示例代码:
#include <linux/hugetlb.h> struct page *alloc_static_hugepage(void) { struct hstate *h = &default_hstate; // 对应默认2MB大页(需匹配系统配置) struct page *page; // 申请1个预分配大页,NUMA_NO_NODE表示不指定NUMA节点 page = hugetlb_alloc_pages(GFP_KERNEL, 0, h, NUMA_NO_NODE); if (!page) { pr_err("Failed to allocate static huge page\n"); return NULL; } // 分配成功后,HugePages_Free会减1,HugePages_Rsvd会加1 return page; } void free_static_hugepage(struct page *page) { if (page) { hugetlb_free_pages(page, 1, &default_hstate); } }
验证方式
- 分配静态大页后,执行
cat /proc/meminfo | grep Huge,会看到HugePages_Free数值减少,HugePages_Rsvd数值增加。 - 若使用透明大页,需查看
AnonHugePages或ShmemHugePages的数值变化。
内容的提问来源于stack exchange,提问作者tensm
相关产品推荐
相关产品推荐

