diff options
Diffstat (limited to 'include/asm-x86')
-rw-r--r-- | include/asm-x86/page_32.h | 2 | ||||
-rw-r--r-- | include/asm-x86/page_64.h | 2 | ||||
-rw-r--r-- | include/asm-x86/pgalloc_32.h | 6 | ||||
-rw-r--r-- | include/asm-x86/pgalloc_64.h | 22 |
4 files changed, 25 insertions, 7 deletions
diff --git a/include/asm-x86/page_32.h b/include/asm-x86/page_32.h index a6fd10f230d2..ba715d9798b0 100644 --- a/include/asm-x86/page_32.h +++ b/include/asm-x86/page_32.h | |||
@@ -50,6 +50,8 @@ typedef unsigned long phys_addr_t; | |||
50 | typedef union { pteval_t pte, pte_low; } pte_t; | 50 | typedef union { pteval_t pte, pte_low; } pte_t; |
51 | typedef pte_t boot_pte_t; | 51 | typedef pte_t boot_pte_t; |
52 | 52 | ||
53 | typedef struct page *pgtable_t; | ||
54 | |||
53 | #endif /* __ASSEMBLY__ */ | 55 | #endif /* __ASSEMBLY__ */ |
54 | #endif /* CONFIG_X86_PAE */ | 56 | #endif /* CONFIG_X86_PAE */ |
55 | 57 | ||
diff --git a/include/asm-x86/page_64.h b/include/asm-x86/page_64.h index dcf0c0746075..f7393bc516ef 100644 --- a/include/asm-x86/page_64.h +++ b/include/asm-x86/page_64.h | |||
@@ -71,6 +71,8 @@ typedef unsigned long pgdval_t; | |||
71 | typedef unsigned long pgprotval_t; | 71 | typedef unsigned long pgprotval_t; |
72 | typedef unsigned long phys_addr_t; | 72 | typedef unsigned long phys_addr_t; |
73 | 73 | ||
74 | typedef struct page *pgtable_t; | ||
75 | |||
74 | typedef struct { pteval_t pte; } pte_t; | 76 | typedef struct { pteval_t pte; } pte_t; |
75 | 77 | ||
76 | #define vmemmap ((struct page *)VMEMMAP_START) | 78 | #define vmemmap ((struct page *)VMEMMAP_START) |
diff --git a/include/asm-x86/pgalloc_32.h b/include/asm-x86/pgalloc_32.h index bab12718a913..6bea6e5b5ee5 100644 --- a/include/asm-x86/pgalloc_32.h +++ b/include/asm-x86/pgalloc_32.h | |||
@@ -31,6 +31,7 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *p | |||
31 | paravirt_alloc_pt(mm, pfn); | 31 | paravirt_alloc_pt(mm, pfn); |
32 | set_pmd(pmd, __pmd(((pteval_t)pfn << PAGE_SHIFT) | _PAGE_TABLE)); | 32 | set_pmd(pmd, __pmd(((pteval_t)pfn << PAGE_SHIFT) | _PAGE_TABLE)); |
33 | } | 33 | } |
34 | #define pmd_pgtable(pmd) pmd_page(pmd) | ||
34 | 35 | ||
35 | /* | 36 | /* |
36 | * Allocate and free page tables. | 37 | * Allocate and free page tables. |
@@ -39,15 +40,16 @@ extern pgd_t *pgd_alloc(struct mm_struct *); | |||
39 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); | 40 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); |
40 | 41 | ||
41 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); | 42 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long); |
42 | extern struct page *pte_alloc_one(struct mm_struct *, unsigned long); | 43 | extern pgtable_t pte_alloc_one(struct mm_struct *, unsigned long); |
43 | 44 | ||
44 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | 45 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) |
45 | { | 46 | { |
46 | free_page((unsigned long)pte); | 47 | free_page((unsigned long)pte); |
47 | } | 48 | } |
48 | 49 | ||
49 | static inline void pte_free(struct mm_struct *mm, struct page *pte) | 50 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) |
50 | { | 51 | { |
52 | pgtable_page_dtor(pte); | ||
51 | __free_page(pte); | 53 | __free_page(pte); |
52 | } | 54 | } |
53 | 55 | ||
diff --git a/include/asm-x86/pgalloc_64.h b/include/asm-x86/pgalloc_64.h index 4f6220db22b1..8d6722320dcc 100644 --- a/include/asm-x86/pgalloc_64.h +++ b/include/asm-x86/pgalloc_64.h | |||
@@ -12,6 +12,8 @@ | |||
12 | #define pgd_populate(mm, pgd, pud) \ | 12 | #define pgd_populate(mm, pgd, pud) \ |
13 | set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud))) | 13 | set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud))) |
14 | 14 | ||
15 | #define pmd_pgtable(pmd) pmd_page(pmd) | ||
16 | |||
15 | static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte) | 17 | static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte) |
16 | { | 18 | { |
17 | set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT))); | 19 | set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT))); |
@@ -91,12 +93,17 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long ad | |||
91 | return (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); | 93 | return (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); |
92 | } | 94 | } |
93 | 95 | ||
94 | static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) | 96 | static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) |
95 | { | 97 | { |
96 | void *p = (void *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); | 98 | struct page *page; |
99 | void *p; | ||
100 | |||
101 | p = (void *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); | ||
97 | if (!p) | 102 | if (!p) |
98 | return NULL; | 103 | return NULL; |
99 | return virt_to_page(p); | 104 | page = virt_to_page(p); |
105 | pgtable_page_ctor(page); | ||
106 | return page; | ||
100 | } | 107 | } |
101 | 108 | ||
102 | /* Should really implement gc for free page table pages. This could be | 109 | /* Should really implement gc for free page table pages. This could be |
@@ -108,12 +115,17 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | |||
108 | free_page((unsigned long)pte); | 115 | free_page((unsigned long)pte); |
109 | } | 116 | } |
110 | 117 | ||
111 | static inline void pte_free(struct mm_struct *mm, struct page *pte) | 118 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) |
112 | { | 119 | { |
120 | pgtable_page_dtor(pte); | ||
113 | __free_page(pte); | 121 | __free_page(pte); |
114 | } | 122 | } |
115 | 123 | ||
116 | #define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte)) | 124 | #define __pte_free_tlb(tlb,pte) \ |
125 | do { \ | ||
126 | pgtable_page_dtor((pte)); \ | ||
127 | tlb_remove_page((tlb), (pte)); \ | ||
128 | } while (0) | ||
117 | 129 | ||
118 | #define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) | 130 | #define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) |
119 | #define __pud_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) | 131 | #define __pud_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) |