Commit 44fc8057 authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds

mm, hugetlb: close race when setting PageTail for gigantic pages

Now that gigantic pages are dynamically allocatable, care must be taken to
ensure that p->first_page is valid before setting PageTail.

If this isn't done, then it is possible to race and have compound_head()
return NULL.
Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
Acked-by: default avatarDavidlohr Bueso <dave@stgolabs.net>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Acked-by: default avatarHillf Danton <hillf.zj@alibaba-inc.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e009d5dc
...@@ -917,7 +917,6 @@ static void prep_compound_gigantic_page(struct page *page, unsigned long order) ...@@ -917,7 +917,6 @@ static void prep_compound_gigantic_page(struct page *page, unsigned long order)
__SetPageHead(page); __SetPageHead(page);
__ClearPageReserved(page); __ClearPageReserved(page);
for (i = 1; i < nr_pages; i++, p = mem_map_next(p, page, i)) { for (i = 1; i < nr_pages; i++, p = mem_map_next(p, page, i)) {
__SetPageTail(p);
/* /*
* For gigantic hugepages allocated through bootmem at * For gigantic hugepages allocated through bootmem at
* boot, it's safer to be consistent with the not-gigantic * boot, it's safer to be consistent with the not-gigantic
...@@ -933,6 +932,9 @@ static void prep_compound_gigantic_page(struct page *page, unsigned long order) ...@@ -933,6 +932,9 @@ static void prep_compound_gigantic_page(struct page *page, unsigned long order)
__ClearPageReserved(p); __ClearPageReserved(p);
set_page_count(p, 0); set_page_count(p, 0);
p->first_page = page; p->first_page = page;
/* Make sure p->first_page is always valid for PageTail() */
smp_wmb();
__SetPageTail(p);
} }
} }
......
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