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: Andrea Arcangeli <aarcange@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
14d1a55cd2
commit
91600e9e59
|
@ -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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue