OSDN Git Service

Merge tag 'powerpc-5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[tomoyo/tomoyo-test1.git] / arch / powerpc / mm / hugetlbpage.c
index 51716c1..a8953f1 100644 (file)
@@ -61,12 +61,17 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp,
                num_hugepd = 1;
        }
 
+       if (!cachep) {
+               WARN_ONCE(1, "No page table cache created for hugetlb tables");
+               return -ENOMEM;
+       }
+
        new = kmem_cache_alloc(cachep, pgtable_gfp_flags(mm, GFP_KERNEL));
 
        BUG_ON(pshift > HUGEPD_SHIFT_MASK);
        BUG_ON((unsigned long)new & HUGEPD_SHIFT_MASK);
 
-       if (! new)
+       if (!new)
                return -ENOMEM;
 
        /*
@@ -130,6 +135,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
        } else {
                pdshift = PUD_SHIFT;
                pu = pud_alloc(mm, pg, addr);
+               if (!pu)
+                       return NULL;
                if (pshift == PUD_SHIFT)
                        return (pte_t *)pu;
                else if (pshift > PMD_SHIFT) {
@@ -138,6 +145,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
                } else {
                        pdshift = PMD_SHIFT;
                        pm = pmd_alloc(mm, pu, addr);
+                       if (!pm)
+                               return NULL;
                        if (pshift == PMD_SHIFT)
                                /* 16MB hugepage */
                                return (pte_t *)pm;
@@ -154,12 +163,16 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
        } else {
                pdshift = PUD_SHIFT;
                pu = pud_alloc(mm, pg, addr);
+               if (!pu)
+                       return NULL;
                if (pshift >= PUD_SHIFT) {
                        ptl = pud_lockptr(mm, pu);
                        hpdp = (hugepd_t *)pu;
                } else {
                        pdshift = PMD_SHIFT;
                        pm = pmd_alloc(mm, pu, addr);
+                       if (!pm)
+                               return NULL;
                        ptl = pmd_lockptr(mm, pm);
                        hpdp = (hugepd_t *)pm;
                }
@@ -581,6 +594,7 @@ __setup("hugepagesz=", hugepage_setup_sz);
 
 static int __init hugetlbpage_init(void)
 {
+       bool configured = false;
        int psize;
 
        if (hugetlb_disabled) {
@@ -631,10 +645,15 @@ static int __init hugetlbpage_init(void)
                        pgtable_cache_add(pdshift - shift);
                else if (IS_ENABLED(CONFIG_PPC_FSL_BOOK3E) || IS_ENABLED(CONFIG_PPC_8xx))
                        pgtable_cache_add(PTE_T_ORDER);
+
+               configured = true;
        }
 
-       if (IS_ENABLED(CONFIG_HUGETLB_PAGE_SIZE_VARIABLE))
-               hugetlbpage_init_default();
+       if (configured) {
+               if (IS_ENABLED(CONFIG_HUGETLB_PAGE_SIZE_VARIABLE))
+                       hugetlbpage_init_default();
+       } else
+               pr_info("Failed to initialize. Disabling HugeTLB");
 
        return 0;
 }