aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/include/asm/book3s/32/pgalloc.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/include/asm/book3s/32/pgalloc.h')
-rw-r--r--arch/powerpc/include/asm/book3s/32/pgalloc.h40
1 files changed, 10 insertions, 30 deletions
diff --git a/arch/powerpc/include/asm/book3s/32/pgalloc.h b/arch/powerpc/include/asm/book3s/32/pgalloc.h
index 82e44b1a00ae..b5b955eb2fb7 100644
--- a/arch/powerpc/include/asm/book3s/32/pgalloc.h
+++ b/arch/powerpc/include/asm/book3s/32/pgalloc.h
@@ -25,10 +25,7 @@
25extern void __bad_pte(pmd_t *pmd); 25extern void __bad_pte(pmd_t *pmd);
26 26
27extern struct kmem_cache *pgtable_cache[]; 27extern struct kmem_cache *pgtable_cache[];
28#define PGT_CACHE(shift) ({ \ 28#define PGT_CACHE(shift) pgtable_cache[shift]
29 BUG_ON(!(shift)); \
30 pgtable_cache[(shift) - 1]; \
31 })
32 29
33static inline pgd_t *pgd_alloc(struct mm_struct *mm) 30static inline pgd_t *pgd_alloc(struct mm_struct *mm)
34{ 31{
@@ -50,8 +47,6 @@ static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
50#define __pmd_free_tlb(tlb,x,a) do { } while (0) 47#define __pmd_free_tlb(tlb,x,a) do { } while (0)
51/* #define pgd_populate(mm, pmd, pte) BUG() */ 48/* #define pgd_populate(mm, pmd, pte) BUG() */
52 49
53#ifndef CONFIG_BOOKE
54
55static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, 50static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
56 pte_t *pte) 51 pte_t *pte)
57{ 52{
@@ -61,46 +56,31 @@ static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
61static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, 56static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
62 pgtable_t pte_page) 57 pgtable_t pte_page)
63{ 58{
64 *pmdp = __pmd((page_to_pfn(pte_page) << PAGE_SHIFT) | _PMD_PRESENT); 59 *pmdp = __pmd(__pa(pte_page) | _PMD_PRESENT);
65}
66
67#define pmd_pgtable(pmd) pmd_page(pmd)
68#else
69
70static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp,
71 pte_t *pte)
72{
73 *pmdp = __pmd((unsigned long)pte | _PMD_PRESENT);
74}
75
76static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp,
77 pgtable_t pte_page)
78{
79 *pmdp = __pmd((unsigned long)lowmem_page_address(pte_page) | _PMD_PRESENT);
80} 60}
81 61
82#define pmd_pgtable(pmd) pmd_page(pmd) 62#define pmd_pgtable(pmd) ((pgtable_t)pmd_page_vaddr(pmd))
83#endif
84 63
85extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); 64extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr);
86extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); 65extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr);
66void pte_frag_destroy(void *pte_frag);
67pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel);
68void pte_fragment_free(unsigned long *table, int kernel);
87 69
88static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 70static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
89{ 71{
90 free_page((unsigned long)pte); 72 pte_fragment_free((unsigned long *)pte, 1);
91} 73}
92 74
93static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) 75static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage)
94{ 76{
95 pgtable_page_dtor(ptepage); 77 pte_fragment_free((unsigned long *)ptepage, 0);
96 __free_page(ptepage);
97} 78}
98 79
99static inline void pgtable_free(void *table, unsigned index_size) 80static inline void pgtable_free(void *table, unsigned index_size)
100{ 81{
101 if (!index_size) { 82 if (!index_size) {
102 pgtable_page_dtor(virt_to_page(table)); 83 pte_fragment_free((unsigned long *)table, 0);
103 free_page((unsigned long)table);
104 } else { 84 } else {
105 BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE); 85 BUG_ON(index_size > MAX_PGTABLE_INDEX_SIZE);
106 kmem_cache_free(PGT_CACHE(index_size), table); 86 kmem_cache_free(PGT_CACHE(index_size), table);
@@ -138,6 +118,6 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb,
138static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, 118static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
139 unsigned long address) 119 unsigned long address)
140{ 120{
141 pgtable_free_tlb(tlb, page_address(table), 0); 121 pgtable_free_tlb(tlb, table, 0);
142} 122}
143#endif /* _ASM_POWERPC_BOOK3S_32_PGALLOC_H */ 123#endif /* _ASM_POWERPC_BOOK3S_32_PGALLOC_H */