aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-powerpc')
-rw-r--r--include/asm-powerpc/page.h2
-rw-r--r--include/asm-powerpc/pgalloc-32.h6
-rw-r--r--include/asm-powerpc/pgalloc-64.h27
3 files changed, 26 insertions, 9 deletions
diff --git a/include/asm-powerpc/page.h b/include/asm-powerpc/page.h
index 61e3725bbd37..df47bbb6ea13 100644
--- a/include/asm-powerpc/page.h
+++ b/include/asm-powerpc/page.h
@@ -190,6 +190,8 @@ extern int page_is_ram(unsigned long pfn);
190 190
191struct vm_area_struct; 191struct vm_area_struct;
192 192
193typedef struct page *pgtable_t;
194
193#include <asm-generic/memory_model.h> 195#include <asm-generic/memory_model.h>
194#endif /* __ASSEMBLY__ */ 196#endif /* __ASSEMBLY__ */
195 197
diff --git a/include/asm-powerpc/pgalloc-32.h b/include/asm-powerpc/pgalloc-32.h
index c162a4c37b39..58c07147b3ea 100644
--- a/include/asm-powerpc/pgalloc-32.h
+++ b/include/asm-powerpc/pgalloc-32.h
@@ -22,17 +22,19 @@ extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
22 (pmd_val(*(pmd)) = __pa(pte) | _PMD_PRESENT) 22 (pmd_val(*(pmd)) = __pa(pte) | _PMD_PRESENT)
23#define pmd_populate(mm, pmd, pte) \ 23#define pmd_populate(mm, pmd, pte) \
24 (pmd_val(*(pmd)) = (page_to_pfn(pte) << PAGE_SHIFT) | _PMD_PRESENT) 24 (pmd_val(*(pmd)) = (page_to_pfn(pte) << PAGE_SHIFT) | _PMD_PRESENT)
25#define pmd_pgtable(pmd) pmd_page(pmd)
25#else 26#else
26#define pmd_populate_kernel(mm, pmd, pte) \ 27#define pmd_populate_kernel(mm, pmd, pte) \
27 (pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT) 28 (pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT)
28#define pmd_populate(mm, pmd, pte) \ 29#define pmd_populate(mm, pmd, pte) \
29 (pmd_val(*(pmd)) = (unsigned long)lowmem_page_address(pte) | _PMD_PRESENT) 30 (pmd_val(*(pmd)) = (unsigned long)lowmem_page_address(pte) | _PMD_PRESENT)
31#define pmd_pgtable(pmd) pmd_page(pmd)
30#endif 32#endif
31 33
32extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); 34extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
33extern struct page *pte_alloc_one(struct mm_struct *mm, unsigned long addr); 35extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
34extern void pte_free_kernel(struct mm_struct *mm, pte_t *pte); 36extern void pte_free_kernel(struct mm_struct *mm, pte_t *pte);
35extern void pte_free(struct mm_struct *mm, struct page *pte); 37extern void pte_free(struct mm_struct *mm, pgtable_t pte);
36 38
37#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte)) 39#define __pte_free_tlb(tlb, pte) pte_free((tlb)->mm, (pte))
38 40
diff --git a/include/asm-powerpc/pgalloc-64.h b/include/asm-powerpc/pgalloc-64.h
index 5afae8593931..68980990f62a 100644
--- a/include/asm-powerpc/pgalloc-64.h
+++ b/include/asm-powerpc/pgalloc-64.h
@@ -58,6 +58,7 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
58#define pmd_populate(mm, pmd, pte_page) \ 58#define pmd_populate(mm, pmd, pte_page) \
59 pmd_populate_kernel(mm, pmd, page_address(pte_page)) 59 pmd_populate_kernel(mm, pmd, page_address(pte_page))
60#define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, (unsigned long)(pte)) 60#define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, (unsigned long)(pte))
61#define pmd_pgtable(pmd) pmd_page(pmd)
61 62
62 63
63#else /* CONFIG_PPC_64K_PAGES */ 64#else /* CONFIG_PPC_64K_PAGES */
@@ -72,6 +73,7 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
72 73
73#define pmd_populate(mm, pmd, pte_page) \ 74#define pmd_populate(mm, pmd, pte_page) \
74 pmd_populate_kernel(mm, pmd, page_address(pte_page)) 75 pmd_populate_kernel(mm, pmd, page_address(pte_page))
76#define pmd_pgtable(pmd) pmd_page(pmd)
75 77
76#endif /* CONFIG_PPC_64K_PAGES */ 78#endif /* CONFIG_PPC_64K_PAGES */
77 79
@@ -92,11 +94,18 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
92 return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO); 94 return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
93} 95}
94 96
95static inline struct page *pte_alloc_one(struct mm_struct *mm, 97static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
96 unsigned long address) 98 unsigned long address)
97{ 99{
98 pte_t *pte = pte_alloc_one_kernel(mm, address); 100 struct page *page;
99 return pte ? virt_to_page(pte) : NULL; 101 pte_t *pte;
102
103 pte = pte_alloc_one_kernel(mm, address);
104 if (!pte)
105 return NULL;
106 page = virt_to_page(pte);
107 pgtable_page_ctor(page);
108 return page;
100} 109}
101 110
102static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 111static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
@@ -104,8 +113,9 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
104 free_page((unsigned long)pte); 113 free_page((unsigned long)pte);
105} 114}
106 115
107static inline void pte_free(struct mm_struct *mm, struct page *ptepage) 116static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
108{ 117{
118 pgtable_page_dtor(ptepage);
109 __free_page(ptepage); 119 __free_page(ptepage);
110} 120}
111 121
@@ -136,9 +146,12 @@ static inline void pgtable_free(pgtable_free_t pgf)
136 146
137extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf); 147extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf);
138 148
139#define __pte_free_tlb(tlb, ptepage) \ 149#define __pte_free_tlb(tlb,ptepage) \
150do { \
151 pgtable_page_dtor(ptepage); \
140 pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \ 152 pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \
141 PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)) 153 PTE_NONCACHE_NUM, PTE_TABLE_SIZE-1)); \
154} while (0)
142#define __pmd_free_tlb(tlb, pmd) \ 155#define __pmd_free_tlb(tlb, pmd) \
143 pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \ 156 pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \
144 PMD_CACHE_NUM, PMD_TABLE_SIZE-1)) 157 PMD_CACHE_NUM, PMD_TABLE_SIZE-1))