2 #include <linux/slab.h>
4 #define PGALLOC_GFP GFP_KERNEL | __GFP_ZERO
6 static struct kmem_cache
*pgd_cachep
;
7 #if PAGETABLE_LEVELS > 2
8 static struct kmem_cache
*pmd_cachep
;
11 void pgd_ctor(void *x
)
15 memcpy(pgd
+ USER_PTRS_PER_PGD
,
16 swapper_pg_dir
+ USER_PTRS_PER_PGD
,
17 (PTRS_PER_PGD
- USER_PTRS_PER_PGD
) * sizeof(pgd_t
));
20 void pgtable_cache_init(void)
22 pgd_cachep
= kmem_cache_create("pgd_cache",
23 PTRS_PER_PGD
* (1<<PTE_MAGNITUDE
),
24 PAGE_SIZE
, SLAB_PANIC
, pgd_ctor
);
25 #if PAGETABLE_LEVELS > 2
26 pmd_cachep
= kmem_cache_create("pmd_cache",
27 PTRS_PER_PMD
* (1<<PTE_MAGNITUDE
),
28 PAGE_SIZE
, SLAB_PANIC
, NULL
);
32 pgd_t
*pgd_alloc(struct mm_struct
*mm
)
34 return kmem_cache_alloc(pgd_cachep
, PGALLOC_GFP
);
37 void pgd_free(struct mm_struct
*mm
, pgd_t
*pgd
)
39 kmem_cache_free(pgd_cachep
, pgd
);
42 #if PAGETABLE_LEVELS > 2
43 void pud_populate(struct mm_struct
*mm
, pud_t
*pud
, pmd_t
*pmd
)
45 set_pud(pud
, __pud((unsigned long)pmd
));
48 pmd_t
*pmd_alloc_one(struct mm_struct
*mm
, unsigned long address
)
50 return kmem_cache_alloc(pmd_cachep
, PGALLOC_GFP
);
53 void pmd_free(struct mm_struct
*mm
, pmd_t
*pmd
)
55 kmem_cache_free(pmd_cachep
, pmd
);
57 #endif /* PAGETABLE_LEVELS > 2 */