On 07/31/2012 03:12 PM, Peter Zijlstra wrote:
+ if (unlikely(pmd_trans_splitting(entry))) { + spin_unlock(&mm->page_table_lock); + wait_split_huge_page(vma->anon_vma, pmd); + return; + } + +#ifdef CONFIG_NUMA + page = pmd_page(entry); + VM_BUG_ON(!PageCompound(page) || !PageHead(page)); + + get_page(page); + spin_unlock(&mm->page_table_lock); + + /* + * XXX should we serialize against split_huge_page ? + */
I believe we are already serialized here, because we check for pmd_trans_splitting while holding the page table lock. The THP code grabs the page table lock when modifying this status, so we should be good.
+ /* + * Due to lacking code to migrate thp pages, we'll split + * (which preserves the special PROT_NONE) and re-take the + * fault on the normal pages. + */ + split_huge_page(page); + put_page(page); + return;
Likewise, the THP code serializes split_huge_page, and has protection against multiple simultaneous invocations of split_huge_page. A second invocation of split_huge_page will see that the page was already split, and it will bail out.
+do_fixup: + spin_lock(&mm->page_table_lock); + if (unlikely(!pmd_same(*pmd, entry))) + goto out_unlock;
If the THP was split for another reason than a NUMA fault, the !pmd_same check here should result in us doing the right thing automatically. I believe this code is correct. Acked-by: Rik van Riel <r...@redhat.com> -- All rights reversed -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/