1 #ifndef _ASM_POWERPC_BOOK3S_64_PGALLOC_H 2 #define _ASM_POWERPC_BOOK3S_64_PGALLOC_H 3 /* 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 */ 9 10 #include <linux/slab.h> 11 #include <linux/cpumask.h> 12 #include <linux/kmemleak.h> 13 #include <linux/percpu.h> 14 15 struct vmemmap_backing { 16 struct vmemmap_backing *list; 17 unsigned long phys; 18 unsigned long virt_addr; 19 }; 20 extern struct vmemmap_backing *vmemmap_list; 21 22 extern pmd_t *pmd_fragment_alloc(struct mm_struct *, unsigned long); 23 extern void pmd_fragment_free(unsigned long *); 24 extern void pgtable_free_tlb(struct mmu_gather *tlb, void *table, int shift); 25 #ifdef CONFIG_SMP 26 extern void __tlb_remove_table(void *_table); 27 #endif 28 void pte_frag_destroy(void *pte_frag); 29 30 static inline pgd_t *radix__pgd_alloc(struct mm_struct *mm) 31 { 32 #ifdef CONFIG_PPC_64K_PAGES 33 return (pgd_t *)__get_free_page(pgtable_gfp_flags(mm, PGALLOC_GFP)); 34 #else 35 struct page *page; 36 page = alloc_pages(pgtable_gfp_flags(mm, PGALLOC_GFP | __GFP_RETRY_MAYFAIL), 37 4); 38 if (!page) 39 return NULL; 40 return (pgd_t *) page_address(page); 41 #endif 42 } 43 44 static inline void radix__pgd_free(struct mm_struct *mm, pgd_t *pgd) 45 { 46 #ifdef CONFIG_PPC_64K_PAGES 47 free_page((unsigned long)pgd); 48 #else 49 free_pages((unsigned long)pgd, 4); 50 #endif 51 } 52 53 static inline pgd_t *pgd_alloc(struct mm_struct *mm) 54 { 55 pgd_t *pgd; 56 57 if (radix_enabled()) 58 return radix__pgd_alloc(mm); 59 60 pgd = kmem_cache_alloc(PGT_CACHE(PGD_INDEX_SIZE), 61 pgtable_gfp_flags(mm, GFP_KERNEL)); 62 if (unlikely(!pgd)) 63 return pgd; 64 65 /* 66 * Don't scan the PGD for pointers, it contains references to PUDs but 67 * those references are not full pointers and so can't be recognised by 68 * kmemleak. 69 */ 70 kmemleak_no_scan(pgd); 71 72 /* 73 * With hugetlb, we don't clear the second half of the page table. 74 * If we share the same slab cache with the pmd or pud level table, 75 * we need to make sure we zero out the full table on alloc. 76 * With 4K we don't store slot in the second half. Hence we don't 77 * need to do this for 4k. 78 */ 79 #if defined(CONFIG_HUGETLB_PAGE) && defined(CONFIG_PPC_64K_PAGES) && \ 80 (H_PGD_INDEX_SIZE == H_PUD_CACHE_INDEX) 81 memset(pgd, 0, PGD_TABLE_SIZE); 82 #endif 83 return pgd; 84 } 85 86 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 87 { 88 if (radix_enabled()) 89 return radix__pgd_free(mm, pgd); 90 kmem_cache_free(PGT_CACHE(PGD_INDEX_SIZE), pgd); 91 } 92 93 static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud) 94 { 95 *pgd = __pgd(__pgtable_ptr_val(pud) | PGD_VAL_BITS); 96 } 97 98 static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) 99 { 100 pud_t *pud; 101 102 pud = kmem_cache_alloc(PGT_CACHE(PUD_CACHE_INDEX), 103 pgtable_gfp_flags(mm, GFP_KERNEL)); 104 /* 105 * Tell kmemleak to ignore the PUD, that means don't scan it for 106 * pointers and don't consider it a leak. PUDs are typically only 107 * referred to by their PGD, but kmemleak is not able to recognise those 108 * as pointers, leading to false leak reports. 109 */ 110 kmemleak_ignore(pud); 111 112 return pud; 113 } 114 115 static inline void pud_free(struct mm_struct *mm, pud_t *pud) 116 { 117 kmem_cache_free(PGT_CACHE(PUD_CACHE_INDEX), pud); 118 } 119 120 static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) 121 { 122 *pud = __pud(__pgtable_ptr_val(pmd) | PUD_VAL_BITS); 123 } 124 125 static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud, 126 unsigned long address) 127 { 128 /* 129 * By now all the pud entries should be none entries. So go 130 * ahead and flush the page walk cache 131 */ 132 flush_tlb_pgtable(tlb, address); 133 pgtable_free_tlb(tlb, pud, PUD_INDEX); 134 } 135 136 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) 137 { 138 return pmd_fragment_alloc(mm, addr); 139 } 140 141 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) 142 { 143 pmd_fragment_free((unsigned long *)pmd); 144 } 145 146 static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, 147 unsigned long address) 148 { 149 /* 150 * By now all the pud entries should be none entries. So go 151 * ahead and flush the page walk cache 152 */ 153 flush_tlb_pgtable(tlb, address); 154 return pgtable_free_tlb(tlb, pmd, PMD_INDEX); 155 } 156 157 static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, 158 pte_t *pte) 159 { 160 *pmd = __pmd(__pgtable_ptr_val(pte) | PMD_VAL_BITS); 161 } 162 163 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, 164 pgtable_t pte_page) 165 { 166 *pmd = __pmd(__pgtable_ptr_val(pte_page) | PMD_VAL_BITS); 167 } 168 169 static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, 170 unsigned long address) 171 { 172 /* 173 * By now all the pud entries should be none entries. So go 174 * ahead and flush the page walk cache 175 */ 176 flush_tlb_pgtable(tlb, address); 177 pgtable_free_tlb(tlb, table, PTE_INDEX); 178 } 179 180 extern atomic_long_t direct_pages_count[MMU_PAGE_COUNT]; 181 static inline void update_page_count(int psize, long count) 182 { 183 if (IS_ENABLED(CONFIG_PROC_FS)) 184 atomic_long_add(count, &direct_pages_count[psize]); 185 } 186 187 #endif /* _ASM_POWERPC_BOOK3S_64_PGALLOC_H */ 188