FAILED: patch "[PATCH] mm: hugetlb: call huge_pte_alloc() only if ptep is null" failed to apply to 3.14-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 3.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
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: [PATCH] mm: hugetlb: call huge_pte_alloc() only if ptep is null
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 +4 -4
@@ -3696,12 +3696,12 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, }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);