Patch "mm: hugetlb: call huge_pte_alloc() only if ptep is null" has been added to the 4.3-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mm: hugetlb: call huge_pte_alloc() only if ptep is null
to the 4.3-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mm-hugetlb-call-huge_pte_alloc-only-if-ptep-is-null.patch
and it can be found in the queue-4.3 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0d777df5d8953293be090d9ab5a355db893e8357Mon Sep 17 00:00:00 2001
From: Naoya Horiguchi <[email protected]>
Date: Fri, 11 Dec 2015 13:40:49 -0800
Subject: mm: hugetlb: call huge_pte_alloc() only if ptep is null
From: Naoya Horiguchi <[email protected]>
commit 0d777df5d8953293be090d9ab5a355db893e8357 upstream.
Currently at the beginning of hugetlb_fault(), we call huge_pte_offset() and check whether the obtained *ptep is a migration/hwpoison entry or not. And if not, then we get to call huge_pte_alloc(). This is racy because the *ptep could turn into migration/hwpoison entry after the huge_pte_offset() check. This race results in BUG_ON in huge_pte_alloc().
We don't have to call huge_pte_alloc() when the huge_pte_offset() returns non-NULL, so let's fix this bug with moving the code into else block.
Note that the *ptep could turn into a migration/hwpoison entry after this block, but that's not a problem because we have another !pte_present check later (we never go into hugetlb_no_page() in that case.)
--- mm/hugetlb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
mm/hugetlb.c +4 -4
@@ -3590,12 +3590,12 @@ int hugetlb_fault(struct mm_struct *mm, }else if (unlikely (is_hugetlb_entry_hwpoisoned (entry)))return VM_FAULT_HWPOISON_LARGE |VM_FAULT_SET_HINDEX (hstate_index (h)); + }else { + ptep =huge_pte_alloc (mm, address,huge_page_size (h)); +if (!ptep) +return VM_FAULT_OOM ; } - ptep =huge_pte_alloc (mm, address,huge_page_size (h)); -if (!ptep) -return VM_FAULT_OOM ; - mapping = vma->vm_file->f_mapping; idx =vma_hugecache_offset (h, vma, address);
Patches currently in stable-queue which might be from [email protected] are
queue-4.3/mm-hugetlb-call-huge_pte_alloc-only-if-ptep-is-null.patch queue-4.3/mm-hugetlbfs-fix-bugs-in-fallocate-hole-punch-of-areas-with-holes.patch queue-4.3/mm-hugetlb-fix-hugepage-memory-leak-caused-by-wrong-reserve-count.patch