提交 91600e9e 编写于 作者: A Andrea Arcangeli 提交者: Linus Torvalds

thp: fix memory-failure hugetlbfs vs THP collision

hugetlbfs was changed to allow memory failure to migrate the hugetlbfs
pages and that broke THP as split_huge_page was then called on hugetlbfs
pages too.

compound_head/order was also run unsafe on THP pages that can be splitted
at any time.

All compound_head() invocations in memory-failure.c that are run on pages
that aren't pinned and that can be freed and reused from under us (while
compound_head is running) are buggy because compound_head can return a
dangling pointer, but I'm not fixing this as this is a generic
memory-failure bug not specific to THP but it applies to hugetlbfs too, so
I can fix it later after THP is merged upstream.
Signed-off-by: NAndrea Arcangeli <aarcange@redhat.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 14d1a55c
...@@ -386,7 +386,7 @@ static void collect_procs_anon(struct page *page, struct list_head *to_kill, ...@@ -386,7 +386,7 @@ static void collect_procs_anon(struct page *page, struct list_head *to_kill,
struct task_struct *tsk; struct task_struct *tsk;
struct anon_vma *av; struct anon_vma *av;
if (unlikely(split_huge_page(page))) if (!PageHuge(page) && unlikely(split_huge_page(page)))
return; return;
read_lock(&tasklist_lock); read_lock(&tasklist_lock);
av = page_lock_anon_vma(page); av = page_lock_anon_vma(page);
......
...@@ -1430,7 +1430,7 @@ int try_to_unmap(struct page *page, enum ttu_flags flags) ...@@ -1430,7 +1430,7 @@ int try_to_unmap(struct page *page, enum ttu_flags flags)
int ret; int ret;
BUG_ON(!PageLocked(page)); BUG_ON(!PageLocked(page));
BUG_ON(PageTransHuge(page)); VM_BUG_ON(!PageHuge(page) && PageTransHuge(page));
if (unlikely(PageKsm(page))) if (unlikely(PageKsm(page)))
ret = try_to_unmap_ksm(page, flags); ret = try_to_unmap_ksm(page, flags);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册