Commit 69ed779a authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds

mm, hugetlb: schedule when potentially allocating many hugepages

A few hugetlb allocators loop while calling the page allocator and can
potentially prevent rescheduling if the page allocator slowpath is not
utilized.

Conditionally schedule when large numbers of hugepages can be allocated.

Anshuman:
 "Fixes a task which was getting hung while writing like 10000 hugepages
  (16MB on POWER8) into /proc/sys/vm/nr_hugepages."

Link: http://lkml.kernel.org/r/alpine.DEB.2.10.1706091535300.66176@chino.kir.corp.google.comSigned-off-by: default avatarDavid Rientjes <rientjes@google.com>
Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
Tested-by: default avatarAnshuman Khandual <khandual@linux.vnet.ibm.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8b913238
...@@ -1781,6 +1781,7 @@ static int gather_surplus_pages(struct hstate *h, int delta) ...@@ -1781,6 +1781,7 @@ static int gather_surplus_pages(struct hstate *h, int delta)
break; break;
} }
list_add(&page->lru, &surplus_list); list_add(&page->lru, &surplus_list);
cond_resched();
} }
allocated += i; allocated += i;
...@@ -2249,6 +2250,7 @@ static void __init hugetlb_hstate_alloc_pages(struct hstate *h) ...@@ -2249,6 +2250,7 @@ static void __init hugetlb_hstate_alloc_pages(struct hstate *h)
} else if (!alloc_fresh_huge_page(h, } else if (!alloc_fresh_huge_page(h,
&node_states[N_MEMORY])) &node_states[N_MEMORY]))
break; break;
cond_resched();
} }
if (i < h->max_huge_pages) { if (i < h->max_huge_pages) {
char buf[32]; char buf[32];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment