num_hugepd = 1;
        }
 
-       new = kmem_cache_zalloc(cachep, pgtable_gfp_flags(mm, GFP_KERNEL));
+       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);
                 * use pgt cache for hugepd.
                 */
                if (pdshift > shift)
-                       pgtable_cache_add(pdshift - shift, NULL);
+                       pgtable_cache_add(pdshift - shift);
 #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx)
                else
-                       pgtable_cache_add(PTE_T_ORDER, NULL);
+                       pgtable_cache_add(PTE_T_ORDER);
 #endif
        }
 
 
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 
-static void pgd_ctor(void *addr)
-{
-       memset(addr, 0, PGD_TABLE_SIZE);
+#define CTOR(shift) static void ctor_##shift(void *addr) \
+{                                                      \
+       memset(addr, 0, sizeof(void *) << (shift));     \
 }
 
-static void pud_ctor(void *addr)
-{
-       memset(addr, 0, PUD_TABLE_SIZE);
-}
+CTOR(0); CTOR(1); CTOR(2); CTOR(3); CTOR(4); CTOR(5); CTOR(6); CTOR(7);
+CTOR(8); CTOR(9); CTOR(10); CTOR(11); CTOR(12); CTOR(13); CTOR(14); CTOR(15);
 
-static void pmd_ctor(void *addr)
+static inline void (*ctor(int shift))(void *)
 {
-       memset(addr, 0, PMD_TABLE_SIZE);
+       BUILD_BUG_ON(MAX_PGTABLE_INDEX_SIZE != 15);
+
+       switch (shift) {
+       case 0: return ctor_0;
+       case 1: return ctor_1;
+       case 2: return ctor_2;
+       case 3: return ctor_3;
+       case 4: return ctor_4;
+       case 5: return ctor_5;
+       case 6: return ctor_6;
+       case 7: return ctor_7;
+       case 8: return ctor_8;
+       case 9: return ctor_9;
+       case 10: return ctor_10;
+       case 11: return ctor_11;
+       case 12: return ctor_12;
+       case 13: return ctor_13;
+       case 14: return ctor_14;
+       case 15: return ctor_15;
+       }
+       return NULL;
 }
 
 struct kmem_cache *pgtable_cache[MAX_PGTABLE_INDEX_SIZE + 1];
  * everything else.  Caches created by this function are used for all
  * the higher level pagetables, and for hugepage pagetables.
  */
-void pgtable_cache_add(unsigned shift, void (*ctor)(void *))
+void pgtable_cache_add(unsigned int shift)
 {
        char *name;
        unsigned long table_size = sizeof(void *) << shift;
 
        align = max_t(unsigned long, align, minalign);
        name = kasprintf(GFP_KERNEL, "pgtable-2^%d", shift);
-       new = kmem_cache_create(name, table_size, align, 0, ctor);
+       new = kmem_cache_create(name, table_size, align, 0, ctor(shift));
        if (!new)
                panic("Could not allocate pgtable cache for order %d", shift);
 
 
 void pgtable_cache_init(void)
 {
-       pgtable_cache_add(PGD_INDEX_SIZE, pgd_ctor);
+       pgtable_cache_add(PGD_INDEX_SIZE);
 
        if (PMD_CACHE_INDEX && !PGT_CACHE(PMD_CACHE_INDEX))
-               pgtable_cache_add(PMD_CACHE_INDEX, pmd_ctor);
+               pgtable_cache_add(PMD_CACHE_INDEX);
        /*
         * In all current configs, when the PUD index exists it's the
         * same size as either the pgd or pmd index except with THP enabled
         * on book3s 64
         */
        if (PUD_CACHE_INDEX && !PGT_CACHE(PUD_CACHE_INDEX))
-               pgtable_cache_add(PUD_CACHE_INDEX, pud_ctor);
+               pgtable_cache_add(PUD_CACHE_INDEX);
 }