typedef struct list_head ptable_desc;
 
-static struct list_head ptable_list[2] = {
+static struct list_head ptable_list[3] = {
        LIST_HEAD_INIT(ptable_list[0]),
        LIST_HEAD_INIT(ptable_list[1]),
+       LIST_HEAD_INIT(ptable_list[2]),
 };
 
 #define PD_PTABLE(page) ((ptable_desc *)&(virt_to_page((void *)(page))->lru))
 #define PD_PAGE(ptable) (list_entry(ptable, struct page, lru))
 #define PD_MARKBITS(dp) (*(unsigned int *)&PD_PAGE(dp)->index)
 
-static const int ptable_shift[2] = {
-       7+2, /* PGD, PMD */
+static const int ptable_shift[3] = {
+       7+2, /* PGD */
+       7+2, /* PMD */
        6+2, /* PTE */
 };
 
                if (!(page = (void *)get_zeroed_page(GFP_KERNEL)))
                        return NULL;
 
-               if (type == TABLE_PTE) {
+               switch (type) {
+               case TABLE_PTE:
                        /*
                         * m68k doesn't have SPLIT_PTE_PTLOCKS for not having
                         * SMP.
                         */
                        pagetable_pte_ctor(virt_to_ptdesc(page));
+                       break;
+               case TABLE_PMD:
+                       pagetable_pmd_ctor(virt_to_ptdesc(page));
+                       break;
                }
 
                mmu_page_ctor(page);
                /* all tables in page are free, free page */
                list_del(dp);
                mmu_page_dtor((void *)page);
-               if (type == TABLE_PTE)
+               if (type == TABLE_PTE || type == TABLE_PMD)
                        pagetable_dtor(virt_to_ptdesc((void *)page));
                free_page (page);
                return 1;