В 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 будет увеличиваться медленно, так проблема в Н-> 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. –