Messages in this thread | | | Date | Thu, 26 Jul 2012 14:31:50 -0400 | From | Rik van Riel <> | Subject | Re: [PATCH -alternative] mm: hugetlbfs: Close race during teardown of hugetlbfs shared page tables V2 (resend) |
| |
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 :)
| |