On Wed, Jul 06, 2022 at 02:51:00PM -0700, Mike Kravetz wrote: > On 07/04/22 10:33, Naoya Horiguchi wrote: > > From: Naoya Horiguchi <naoya.horiguchi@xxxxxxx> > > > > I found a weird state of 1GB hugepage pool, caused by the following > > procedure: > > > > - run a process reserving all free 1GB hugepages, > > - shrink free 1GB hugepage pool to zero (i.e. writing 0 to > > /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages), then > > - kill the reserving process. > > > > , then all the hugepages are free *and* surplus at the same time. > > > > $ cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages > > 3 > > $ cat /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages > > 3 > > $ cat /sys/kernel/mm/hugepages/hugepages-1048576kB/resv_hugepages > > 0 > > $ cat /sys/kernel/mm/hugepages/hugepages-1048576kB/surplus_hugepages > > 3 > > > > This state is resolved by reserving and allocating the pages then > > freeing them again, so this seems not to result in serious problem. > > But it's a little surprising (shrinking pool suddenly fails). > > > > This behavior is caused by hstate_is_gigantic() check in > > return_unused_surplus_pages(). This was introduced so long ago in 2008 > > by commit aa888a74977a ("hugetlb: support larger than MAX_ORDER"), and > > at that time the gigantic pages were not supposed to be allocated/freed > > at run-time. Now kernel can support runtime allocation/free, so let's > > check gigantic_page_runtime_supported() together. > > > > Signed-off-by: Naoya Horiguchi <naoya.horiguchi@xxxxxxx> > > --- > > v2 -> v3: > > - Fixed typo in patch description, > > - add !gigantic_page_runtime_supported() check instead of removing > > hstate_is_gigantic() check (suggested by Miaohe and Muchun) > > - add a few more !gigantic_page_runtime_supported() check in > > set_max_huge_pages() (by Mike). > > Hi Naoya, > > My apologies for suggesting the above checks in set_max_huge_pages(). > set_max_huge_pages is only called from __nr_hugepages_store_common. > At the very beginning of __nr_hugepages_store_common is this: > > if (hstate_is_gigantic(h) && !gigantic_page_runtime_supported()) > return -EINVAL; > > So, those extra checks in set_max_huge_pages are unnecessary. Sorry! OK, so I'll drop both checks, thank you. - Naoya Horiguchi