3 #define PGALLOC_GFP GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO
5 static struct kmem_cache
*pgd_cachep
;
6 #if PAGETABLE_LEVELS > 2
7 static struct kmem_cache
*pmd_cachep
;
10 void pgd_ctor(void *x
)
14 memcpy(pgd
+ USER_PTRS_PER_PGD
,
15 swapper_pg_dir
+ USER_PTRS_PER_PGD
,
16 (PTRS_PER_PGD
- USER_PTRS_PER_PGD
) * sizeof(pgd_t
));
19 void pgtable_cache_init(void)
21 pgd_cachep
= kmem_cache_create("pgd_cache",
22 PTRS_PER_PGD
* (1<<PTE_MAGNITUDE
),
23 PAGE_SIZE
, SLAB_PANIC
, pgd_ctor
);
24 #if PAGETABLE_LEVELS > 2
25 pmd_cachep
= kmem_cache_create("pmd_cache",
26 PTRS_PER_PMD
* (1<<PTE_MAGNITUDE
),
27 PAGE_SIZE
, SLAB_PANIC
, NULL
);
31 pgd_t
*pgd_alloc(struct mm_struct
*mm
)
33 return kmem_cache_alloc(pgd_cachep
, PGALLOC_GFP
);
36 void pgd_free(struct mm_struct
*mm
, pgd_t
*pgd
)
38 kmem_cache_free(pgd_cachep
, pgd
);
41 #if PAGETABLE_LEVELS > 2
42 void pud_populate(struct mm_struct
*mm
, pud_t
*pud
, pmd_t
*pmd
)
44 set_pud(pud
, __pud((unsigned long)pmd
));
47 pmd_t
*pmd_alloc_one(struct mm_struct
*mm
, unsigned long address
)
49 return kmem_cache_alloc(pmd_cachep
, PGALLOC_GFP
);
52 void pmd_free(struct mm_struct
*mm
, pmd_t
*pmd
)
54 kmem_cache_free(pmd_cachep
, pmd
);
56 #endif /* PAGETABLE_LEVELS > 2 */