diff options
Diffstat (limited to 'arch/powerpc/include/asm/book3s/32/pgalloc.h')
| -rw-r--r-- | arch/powerpc/include/asm/book3s/32/pgalloc.h | 40 |
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 @@ | |||
| 25 | extern void __bad_pte(pmd_t *pmd); | 25 | extern void __bad_pte(pmd_t *pmd); |
| 26 | 26 | ||
| 27 | extern struct kmem_cache *pgtable_cache[]; | 27 | extern 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 | ||
| 33 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | 30 | static 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 | |||
| 55 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, | 50 | static 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, | |||
| 61 | static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmdp, | 56 | static 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 | |||
| 70 | static 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 | |||
| 76 | static 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 | ||
| 85 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); | 64 | extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); |
| 86 | extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); | 65 | extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr); |
| 66 | void pte_frag_destroy(void *pte_frag); | ||
| 67 | pte_t *pte_fragment_alloc(struct mm_struct *mm, unsigned long vmaddr, int kernel); | ||
| 68 | void pte_fragment_free(unsigned long *table, int kernel); | ||
| 87 | 69 | ||
| 88 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | 70 | static 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 | ||
| 93 | static inline void pte_free(struct mm_struct *mm, pgtable_t ptepage) | 75 | static 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 | ||
| 99 | static inline void pgtable_free(void *table, unsigned index_size) | 80 | static 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, | |||
| 138 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, | 118 | static 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 */ |
