powerpc: disable assert_pte_locked for collapse_huge_page
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Thu, 20 Jun 2013 09:00:24 +0000 (14:30 +0530)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 21 Jun 2013 06:01:57 +0000 (16:01 +1000)
With THP we set pmd to none, before we do pte_clear. Hence we can't
walk page table to get the pte lock ptr and verify whether it is locked.
THP do take pte lock before calling pte_clear. So we don't change the locking
rules here. It is that we can't use page table walking to check whether
pte locks are held with THP.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/mm/pgtable.c

index 214130a4edc6bf2ff82b35bde8d955d98c75b01d..edda589795c3e30c09a900261aa11da6f6fea0fe 100644 (file)
@@ -235,6 +235,14 @@ void assert_pte_locked(struct mm_struct *mm, unsigned long addr)
        pud = pud_offset(pgd, addr);
        BUG_ON(pud_none(*pud));
        pmd = pmd_offset(pud, addr);
+       /*
+        * khugepaged to collapse normal pages to hugepage, first set
+        * pmd to none to force page fault/gup to take mmap_sem. After
+        * pmd is set to none, we do a pte_clear which does this assertion
+        * so if we find pmd none, return.
+        */
+       if (pmd_none(*pmd))
+               return;
        BUG_ON(!pmd_present(*pmd));
        assert_spin_locked(pte_lockptr(mm, pmd));
 }