Skip to content

Commit b72b3c9

Browse files
Martins3akpm00
authored andcommitted
mm/hugetlb: fix nodes huge page allocation when there are surplus pages
In set_nr_huge_pages(), local variable "count" is used to record persistent_huge_pages(), but when it cames to nodes huge page allocation, the semantics changes to nr_huge_pages. When there exists surplus huge pages and using the interface under /sys/devices/system/node/node*/hugepages to change huge page pool size, this difference can result in the allocation of an unexpected number of huge pages. Steps to reproduce the bug: Starting with: Node 0 Node 1 Total HugePages_Total 0.00 0.00 0.00 HugePages_Free 0.00 0.00 0.00 HugePages_Surp 0.00 0.00 0.00 create 100 huge pages in Node 0 and consume it, then set Node 0 's nr_hugepages to 0. yields: Node 0 Node 1 Total HugePages_Total 200.00 0.00 200.00 HugePages_Free 0.00 0.00 0.00 HugePages_Surp 200.00 0.00 200.00 write 100 to Node 1's nr_hugepages echo 100 > /sys/devices/system/node/node1/\ hugepages/hugepages-2048kB/nr_hugepages gets: Node 0 Node 1 Total HugePages_Total 200.00 400.00 600.00 HugePages_Free 0.00 400.00 400.00 HugePages_Surp 200.00 0.00 200.00 Kernel is expected to create only 100 huge pages and it gives 200. Link: https://lkml.kernel.org/r/[email protected] Fixes: 9a30523 ("hugetlb: add per node hstate attributes") Signed-off-by: Xueshi Hu <[email protected]> Reviewed-by: Mike Kravetz <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Lee Schermerhorn <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Muchun Song <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent d8f5f7e commit b72b3c9

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

mm/hugetlb.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3457,7 +3457,9 @@ static int set_max_huge_pages(struct hstate *h, unsigned long count, int nid,
34573457
if (nid != NUMA_NO_NODE) {
34583458
unsigned long old_count = count;
34593459

3460-
count += h->nr_huge_pages - h->nr_huge_pages_node[nid];
3460+
count += persistent_huge_pages(h) -
3461+
(h->nr_huge_pages_node[nid] -
3462+
h->surplus_huge_pages_node[nid]);
34613463
/*
34623464
* User may have specified a large count value which caused the
34633465
* above calculation to overflow. In this case, they wanted

0 commit comments

Comments
 (0)