的decrement_hugepage_resv_vma功能嘗試-1 resv_huge_pages, 但無符號算術使其代替ULONG_MAX(無符號長resv_huge_pages),這是18446744073709551615在64位的系統。
alloc_huge_page()
page = dequeue_huge_page_vma(h, vma, addr, avoid_reserve)
decrement_hugepage_resv_vma() {
h->resv_huge_pages--;
}
static void return_unused_surplus_pages(struct hstate *h,
unsigned long unused_resv_pages)
{
h->resv_huge_pages -= unused_resv_pages;
}
其他較少的原因是gather_surplus_pages()函數可以溢出resv_huge_pages。
您在嘗試下一個測試:
while [ 1 ] ; do date | awk '{print $4}' >> HugePages_Rsvd.log; cat /proc/meminfo | grep HugePages_Rsvd >> HugePages_Rsvd.log; sleep 1; done
我客串如果resv_huge_pages將在H-> resv_huge_pages + =增量遞增慢慢等問題;
但是如果resv_huge_pages突然變成-1(unsigned long == 18446744073709551615)所以問題在h-> resv_huge_pages--; (resv_huge_pages是0和aftre遞減== -1)
依靠從你的內核,則可以檢查補丁 毫米:NUMA:禁用VMA(VM_HUGETLB)更改保護 6b79c57b92cdd90853002980609af516d14c4f9c 和BUG large value for HugePages_Rsvd
我相信有一定的指導意義事實上,這正是2 ** 64-1。 –