OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-or32/] [pgalloc.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1276 phoenix
#ifndef _OR32_PGALLOC_H
2
#define _OR32_PGALLOC_H
3
 
4
#include <asm/page.h>
5
#include <linux/threads.h>
6
 
7
extern struct pgtable_cache_struct {
8
        unsigned long *pgd_cache;
9
        unsigned long *pte_cache;
10
        unsigned long pgtable_cache_sz;
11
} quicklists;
12
 
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)
17
 
18
#define pmd_populate(mm, pmd, pte) \
19
                set_pmd(pmd, __pmd(__pa(pte)))
20
 
21
/*
22
 * Allocate and free page tables.
23
 */
24
 
25
extern __inline__ pgd_t *get_pgd_slow(void)
26
{
27
        pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
28
 
29
        if (ret) {
30
                memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
31
                memcpy(ret + USER_PTRS_PER_PGD, swapper_pg_dir + USER_PTRS_PER_PGD,
32
                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
33
        }
34
        return ret;
35
}
36
 
37
extern __inline__ void free_pgd_slow(pgd_t *pgd)
38
{
39
        free_page((unsigned long)pgd);
40
}
41
 
42
extern __inline__ pgd_t *get_pgd_fast(void)
43
{
44
        unsigned long *ret;
45
 
46
        if ((ret = pgd_quicklist) != NULL) {
47
                pgd_quicklist = (unsigned long *)(*ret);
48
                ret[0] = 0;
49
                pgtable_cache_size--;
50
        } else
51
                ret = (unsigned long *)get_pgd_slow();
52
        return (pgd_t *)ret;
53
}
54
 
55
extern __inline__ void free_pgd_fast(pgd_t *pgd)
56
{
57
        *(unsigned long *)pgd = (unsigned long) pgd_quicklist;
58
        pgd_quicklist = (unsigned long *) pgd;
59
        pgtable_cache_size++;
60
}
61
 
62
static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
63
{
64
        pte_t *pte;
65
 
66
        pte = (pte_t *) __get_free_page(GFP_KERNEL);
67
        if (pte)
68
                clear_page(pte);
69
        return pte;
70
}
71
 
72
static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm, unsigned long address)
73
{
74
        unsigned long *ret;
75
 
76
        if((ret = (unsigned long *)pte_quicklist) != NULL) {
77
                pte_quicklist = (unsigned long *)(*ret);
78
                ret[0] = ret[1];
79
                pgtable_cache_size--;
80
        }
81
        return (pte_t *)ret;
82
}
83
 
84
static __inline__ void pte_free_fast(pte_t *pte)
85
{
86
        *(unsigned long *)pte = (unsigned long) pte_quicklist;
87
        pte_quicklist = (unsigned long *) pte;
88
        pgtable_cache_size++;
89
}
90
 
91
static __inline__ void pte_free_slow(pte_t *pte)
92
{
93
        free_page((unsigned long)pte);
94
}
95
 
96
#define pte_free(pte)      pte_free_slow(pte)
97
#define pgd_free(pgd)      free_pgd_slow(pgd)
98
#define pgd_alloc(mm)      get_pgd_fast()
99
 
100
/*
101
 * We don't have any real pmd's, and this code never triggers because
102
 * the pgd will always be present..
103
 */
104
 
105
#define pmd_alloc_one_fast(mm, addr)    ({ BUG(); ((pmd_t *)1); })
106
#define pmd_alloc_one(mm, addr)         ({ BUG(); ((pmd_t *)2); })
107
#define pmd_free_slow(x)                do { } while (0)
108
#define pmd_free_fast(x)                do { } while (0)
109
#define pmd_free(x)                     do { } while (0)
110
#define pgd_populate(mm, pmd, pte)      BUG()
111
 
112
/* other stuff */
113
 
114
extern int do_check_pgt_cache(int, int);
115
 
116
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.