1 #ifndef _CRIS_PGALLOC_H
2 #define _CRIS_PGALLOC_H
5 #include <linux/threads.h>
7 extern struct pgtable_cache_struct {
8 unsigned long *pgd_cache;
9 unsigned long *pte_cache;
10 unsigned long pgtable_cache_sz;
13 #define pgd_quicklist (quicklists.pgd_cache)
14 #define pmd_quicklist ((unsigned long *)0)
15 #define pte_quicklist (quicklists.pte_cache)
16 #define pgtable_cache_size (quicklists.pgtable_cache_sz)
18 #define pmd_populate(mm, pmd, pte) pmd_set(pmd, pte)
21 * Allocate and free page tables.
24 extern __inline__ pgd_t *get_pgd_slow(void)
26 pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
29 memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
30 memcpy(ret + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD,
31 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
36 extern __inline__ void free_pgd_slow(pgd_t *pgd)
38 free_page((unsigned long)pgd);
41 extern __inline__ pgd_t *get_pgd_fast(void)
45 if ((ret = pgd_quicklist) != NULL) {
46 pgd_quicklist = (unsigned long *)(*ret);
50 ret = (unsigned long *)get_pgd_slow();
54 extern __inline__ void free_pgd_fast(pgd_t *pgd)
56 *(unsigned long *)pgd = (unsigned long) pgd_quicklist;
57 pgd_quicklist = (unsigned long *) pgd;
61 extern inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
65 pte = (pte_t *) __get_free_page(GFP_KERNEL);
71 extern inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
75 if((ret = (unsigned long *)pte_quicklist) != NULL) {
76 pte_quicklist = (unsigned long *)(*ret);
83 extern __inline__ void pte_free_fast(pte_t *pte)
85 *(unsigned long *)pte = (unsigned long) pte_quicklist;
86 pte_quicklist = (unsigned long *) pte;
90 extern __inline__ void pte_free_slow(pte_t *pte)
92 free_page((unsigned long)pte);
95 #define pte_free(pte) pte_free_slow(pte)
96 #define pgd_free(pgd) free_pgd_slow(pgd)
97 #define pgd_alloc(mm) get_pgd_fast()
100 * We don't have any real pmd's, and this code never triggers because
101 * the pgd will always be present..
104 #define pmd_alloc_one_fast(mm, addr) ({ BUG(); ((pmd_t *)1); })
105 #define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); })
106 #define pmd_free_slow(x) do { } while (0)
107 #define pmd_free_fast(x) do { } while (0)
108 #define pmd_free(x) do { } while (0)
109 #define pgd_populate(mm, pmd, pte) BUG()
113 extern int do_check_pgt_cache(int, int);