powerpc: get rid of superfluous __GFP_REPEAT
[cascardo/linux.git] / arch / powerpc / mm / hugetlbpage.c
index d991b9e..119d186 100644 (file)
@@ -73,7 +73,7 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp,
        cachep = PGT_CACHE(pdshift - pshift);
 #endif
 
-       new = kmem_cache_zalloc(cachep, GFP_KERNEL|__GFP_REPEAT);
+       new = kmem_cache_zalloc(cachep, GFP_KERNEL);
 
        BUG_ON(pshift > HUGEPD_SHIFT_MASK);
        BUG_ON((unsigned long)new & HUGEPD_SHIFT_MASK);
@@ -711,6 +711,9 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
        struct hstate *hstate = hstate_file(file);
        int mmu_psize = shift_to_mmu_psize(huge_page_shift(hstate));
 
+       if (radix_enabled())
+               return radix__hugetlb_get_unmapped_area(file, addr, len,
+                                                      pgoff, flags);
        return slice_get_unmapped_area(addr, len, flags, mmu_psize, 1);
 }
 #endif
@@ -719,14 +722,14 @@ unsigned long vma_mmu_pagesize(struct vm_area_struct *vma)
 {
 #ifdef CONFIG_PPC_MM_SLICES
        unsigned int psize = get_slice_psize(vma->vm_mm, vma->vm_start);
-
-       return 1UL << mmu_psize_to_shift(psize);
-#else
+       /* With radix we don't use slice, so derive it from vma*/
+       if (!radix_enabled())
+               return 1UL << mmu_psize_to_shift(psize);
+#endif
        if (!is_vm_hugetlb_page(vma))
                return PAGE_SIZE;
 
        return huge_page_size(hstate_vma(vma));
-#endif
 }
 
 static inline bool is_power_of_4(unsigned long x)
@@ -772,8 +775,10 @@ static int __init hugepage_setup_sz(char *str)
 
        size = memparse(str, &str);
 
-       if (add_huge_page_size(size) != 0)
-               printk(KERN_WARNING "Invalid huge page size specified(%llu)\n", size);
+       if (add_huge_page_size(size) != 0) {
+               hugetlb_bad_size();
+               pr_err("Invalid huge page size specified(%llu)\n", size);
+       }
 
        return 1;
 }
@@ -823,7 +828,7 @@ static int __init hugetlbpage_init(void)
 {
        int psize;
 
-       if (!mmu_has_feature(MMU_FTR_16M_PAGE))
+       if (!radix_enabled() && !mmu_has_feature(MMU_FTR_16M_PAGE))
                return -ENODEV;
 
        for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
@@ -863,6 +868,9 @@ static int __init hugetlbpage_init(void)
                HPAGE_SHIFT = mmu_psize_defs[MMU_PAGE_16M].shift;
        else if (mmu_psize_defs[MMU_PAGE_1M].shift)
                HPAGE_SHIFT = mmu_psize_defs[MMU_PAGE_1M].shift;
+       else if (mmu_psize_defs[MMU_PAGE_2M].shift)
+               HPAGE_SHIFT = mmu_psize_defs[MMU_PAGE_2M].shift;
+
 
        return 0;
 }
@@ -1003,9 +1011,9 @@ int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr,
                end = pte_end;
 
        pte = READ_ONCE(*ptep);
-       mask = _PAGE_PRESENT | _PAGE_USER;
+       mask = _PAGE_PRESENT | _PAGE_READ;
        if (write)
-               mask |= _PAGE_RW;
+               mask |= _PAGE_WRITE;
 
        if ((pte_val(pte) & mask) != mask)
                return 0;