On 07/20/2012 10:36 AM, Michal Hocko wrote:
--- a/arch/x86/mm/hugetlbpage.c +++ b/arch/x86/mm/hugetlbpage.c @@ -81,7 +81,12 @@ static void huge_pmd_share(struct mm_struct *mm, unsigned long addr, pud_t *pud) if (saddr) { spte = huge_pte_offset(svma->vm_mm, saddr); if (spte) { - get_page(virt_to_page(spte)); + struct page *spte_page = virt_to_page(spte); + if (!is_hugetlb_pmd_page_valid(spte_page)) {
What prevents somebody else from marking the hugetlb pmd invalid, between here...
+ spte = NULL; + continue; + }
... and here?
+ get_page(spte_page); break; }
I think need to take the refcount before checking whether the hugetlb pmd is still valid. Also, disregard my previous email in this thread, I just read Mel's detailed explanation and wrapped my brain around the bug :) -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>