Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
include
asm
pgalloc.h
Go to the documentation of this file.
1
#ifndef _ASM_X86_PGALLOC_H
2
#define _ASM_X86_PGALLOC_H
3
4
#include <
linux/threads.h
>
5
#include <
linux/mm.h
>
/* for struct page */
6
#include <
linux/pagemap.h
>
7
8
static
inline
int
__paravirt_pgd_alloc(
struct
mm_struct
*mm) {
return
0; }
9
10
#ifdef CONFIG_PARAVIRT
11
#include <asm/paravirt.h>
12
#else
13
#define paravirt_pgd_alloc(mm) __paravirt_pgd_alloc(mm)
14
static
inline
void
paravirt_pgd_free(
struct
mm_struct
*mm,
pgd_t
*pgd) {}
15
static
inline
void
paravirt_alloc_pte(
struct
mm_struct
*mm,
unsigned
long
pfn) {}
16
static
inline
void
paravirt_alloc_pmd(
struct
mm_struct
*mm,
unsigned
long
pfn) {}
17
static
inline
void
paravirt_alloc_pmd_clone(
unsigned
long
pfn,
unsigned
long
clonepfn,
18
unsigned
long
start
,
unsigned
long
count
) {}
19
static
inline
void
paravirt_alloc_pud(
struct
mm_struct
*mm,
unsigned
long
pfn) {}
20
static
inline
void
paravirt_release_pte(
unsigned
long
pfn) {}
21
static
inline
void
paravirt_release_pmd(
unsigned
long
pfn) {}
22
static
inline
void
paravirt_release_pud(
unsigned
long
pfn) {}
23
#endif
24
25
/*
26
* Flags to use when allocating a user page table page.
27
*/
28
extern
gfp_t
__userpte_alloc_gfp
;
29
30
/*
31
* Allocate and free page tables.
32
*/
33
extern
pgd_t
*
pgd_alloc
(
struct
mm_struct
*);
34
extern
void
pgd_free
(
struct
mm_struct
*mm,
pgd_t
*pgd);
35
36
extern
pte_t
*
pte_alloc_one_kernel
(
struct
mm_struct
*,
unsigned
long
);
37
extern
pgtable_t
pte_alloc_one
(
struct
mm_struct
*,
unsigned
long
);
38
39
/* Should really implement gc for free page table pages. This could be
40
done with a reference count in struct page. */
41
42
static
inline
void
pte_free_kernel
(
struct
mm_struct
*mm,
pte_t
*
pte
)
43
{
44
BUG_ON
((
unsigned
long
)pte & (
PAGE_SIZE
-1));
45
free_page
((
unsigned
long
)pte);
46
}
47
48
static
inline
void
pte_free
(
struct
mm_struct
*mm,
struct
page
*pte)
49
{
50
pgtable_page_dtor(pte);
51
__free_page
(pte);
52
}
53
54
extern
void
___pte_free_tlb
(
struct
mmu_gather
*tlb,
struct
page
*pte);
55
56
static
inline
void
__pte_free_tlb
(
struct
mmu_gather
*tlb,
struct
page
*pte,
57
unsigned
long
address
)
58
{
59
___pte_free_tlb
(tlb, pte);
60
}
61
62
static
inline
void
pmd_populate_kernel
(
struct
mm_struct
*mm,
63
pmd_t
*
pmd
,
pte_t
*pte)
64
{
65
paravirt_alloc_pte(mm,
__pa
(pte) >>
PAGE_SHIFT
);
66
set_pmd
(pmd,
__pmd
(
__pa
(pte) |
_PAGE_TABLE
));
67
}
68
69
static
inline
void
pmd_populate
(
struct
mm_struct
*mm,
pmd_t
*pmd,
70
struct
page
*pte)
71
{
72
unsigned
long
pfn =
page_to_pfn
(pte);
73
74
paravirt_alloc_pte(mm, pfn);
75
set_pmd
(pmd,
__pmd
(((
pteval_t
)pfn <<
PAGE_SHIFT
) |
_PAGE_TABLE
));
76
}
77
78
#define pmd_pgtable(pmd) pmd_page(pmd)
79
80
#if PAGETABLE_LEVELS > 2
81
static
inline
pmd_t
*
pmd_alloc_one
(
struct
mm_struct
*mm,
unsigned
long
addr
)
82
{
83
return
(
pmd_t
*)
get_zeroed_page
(
GFP_KERNEL
|
__GFP_REPEAT
);
84
}
85
86
static
inline
void
pmd_free
(
struct
mm_struct
*mm,
pmd_t
*pmd)
87
{
88
BUG_ON
((
unsigned
long
)pmd & (
PAGE_SIZE
-1));
89
free_page
((
unsigned
long
)pmd);
90
}
91
92
extern
void
___pmd_free_tlb(
struct
mmu_gather
*tlb,
pmd_t
*pmd);
93
94
static
inline
void
__pmd_free_tlb
(
struct
mmu_gather
*tlb,
pmd_t
*pmd,
95
unsigned
long
address
)
96
{
97
___pmd_free_tlb(tlb, pmd);
98
}
99
100
#ifdef CONFIG_X86_PAE
101
extern
void
pud_populate
(
struct
mm_struct
*mm,
pud_t
*pudp,
pmd_t
*pmd);
102
#else
/* !CONFIG_X86_PAE */
103
static
inline
void
pud_populate
(
struct
mm_struct
*mm,
pud_t
*pud,
pmd_t
*pmd)
104
{
105
paravirt_alloc_pmd(mm,
__pa
(pmd) >>
PAGE_SHIFT
);
106
set_pud
(pud,
__pud
(
_PAGE_TABLE
|
__pa
(pmd)));
107
}
108
#endif
/* CONFIG_X86_PAE */
109
110
#if PAGETABLE_LEVELS > 3
111
static
inline
void
pgd_populate
(
struct
mm_struct
*mm,
pgd_t
*pgd,
pud_t
*pud)
112
{
113
paravirt_alloc_pud(mm,
__pa
(pud) >>
PAGE_SHIFT
);
114
set_pgd
(pgd,
__pgd
(
_PAGE_TABLE
|
__pa
(pud)));
115
}
116
117
static
inline
pud_t
*
pud_alloc_one
(
struct
mm_struct
*mm,
unsigned
long
addr
)
118
{
119
return
(
pud_t
*)
get_zeroed_page
(
GFP_KERNEL
|
__GFP_REPEAT
);
120
}
121
122
static
inline
void
pud_free
(
struct
mm_struct
*mm,
pud_t
*pud)
123
{
124
BUG_ON
((
unsigned
long
)pud & (
PAGE_SIZE
-1));
125
free_page
((
unsigned
long
)pud);
126
}
127
128
extern
void
___pud_free_tlb(
struct
mmu_gather
*tlb,
pud_t
*pud);
129
130
static
inline
void
__pud_free_tlb
(
struct
mmu_gather
*tlb,
pud_t
*pud,
131
unsigned
long
address
)
132
{
133
___pud_free_tlb(tlb, pud);
134
}
135
136
#endif
/* PAGETABLE_LEVELS > 3 */
137
#endif
/* PAGETABLE_LEVELS > 2 */
138
139
#endif
/* _ASM_X86_PGALLOC_H */
Generated on Thu Jan 10 2013 12:50:12 for Linux Kernel by
1.8.2