powerpc: Update gup_pmd_range to handle transparent hugepages
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Thu, 20 Jun 2013 09:00:20 +0000 (14:30 +0530)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 21 Jun 2013 06:01:55 +0000 (16:01 +1000)
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
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/gup.c

index 4b921affa495d2e315e0598a06c34c0d2231be38..223a255545fc077a30da71b45f00be032dc488f8 100644 (file)
@@ -66,9 +66,15 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
                pmd_t pmd = *pmdp;
 
                next = pmd_addr_end(addr, end);
-               if (pmd_none(pmd))
+               /*
+                * If we find a splitting transparent hugepage we
+                * return zero. That will result in taking the slow
+                * path which will call wait_split_huge_page()
+                * if the pmd is still in splitting state
+                */
+               if (pmd_none(pmd) || pmd_trans_splitting(pmd))
                        return 0;
-               if (pmd_huge(pmd)) {
+               if (pmd_huge(pmd) || pmd_large(pmd)) {
                        if (!gup_hugepte((pte_t *)pmdp, PMD_SIZE, addr, next,
                                         write, pages, nr))
                                return 0;