Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/mm,vmem: simplify region and segment table allocation code

Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Heiko Carstens and committed by
Martin Schwidefsky
a01ef308 58cdf5eb

+18 -39
+4
arch/s390/include/asm/pgalloc.h
··· 160 160 161 161 extern void rcu_table_freelist_finish(void); 162 162 163 + void vmem_map_init(void); 164 + void *vmem_crst_alloc(unsigned long val); 165 + pte_t *vmem_pte_alloc(void); 166 + 163 167 #endif /* _S390_PGALLOC_H */
-3
arch/s390/include/asm/pgtable.h
··· 21 21 22 22 extern pgd_t swapper_pg_dir[]; 23 23 extern void paging_init(void); 24 - extern void vmem_map_init(void); 25 - pmd_t *vmem_pmd_alloc(void); 26 - pte_t *vmem_pte_alloc(void); 27 24 28 25 enum { 29 26 PG_DIRECT_MAP_4K = 0,
+2 -1
arch/s390/mm/pageattr.c
··· 7 7 #include <asm/cacheflush.h> 8 8 #include <asm/facility.h> 9 9 #include <asm/pgtable.h> 10 + #include <asm/pgalloc.h> 10 11 #include <asm/page.h> 11 12 #include <asm/set_memory.h> 12 13 ··· 192 191 pud_t new; 193 192 int i, ro, nx; 194 193 195 - pm_dir = vmem_pmd_alloc(); 194 + pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY); 196 195 if (!pm_dir) 197 196 return -ENOMEM; 198 197 pmd_addr = pud_pfn(*pudp) << PAGE_SHIFT;
+12 -35
arch/s390/mm/vmem.c
··· 38 38 return (void *) memblock_alloc(size, size); 39 39 } 40 40 41 - static inline p4d_t *vmem_p4d_alloc(void) 41 + void *vmem_crst_alloc(unsigned long val) 42 42 { 43 - p4d_t *p4d = NULL; 43 + unsigned long *table; 44 44 45 - p4d = vmem_alloc_pages(2); 46 - if (!p4d) 47 - return NULL; 48 - clear_table((unsigned long *) p4d, _REGION2_ENTRY_EMPTY, PAGE_SIZE * 4); 49 - return p4d; 50 - } 51 - 52 - static inline pud_t *vmem_pud_alloc(void) 53 - { 54 - pud_t *pud = NULL; 55 - 56 - pud = vmem_alloc_pages(2); 57 - if (!pud) 58 - return NULL; 59 - clear_table((unsigned long *) pud, _REGION3_ENTRY_EMPTY, PAGE_SIZE * 4); 60 - return pud; 61 - } 62 - 63 - pmd_t *vmem_pmd_alloc(void) 64 - { 65 - pmd_t *pmd = NULL; 66 - 67 - pmd = vmem_alloc_pages(2); 68 - if (!pmd) 69 - return NULL; 70 - clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE * 4); 71 - return pmd; 45 + table = vmem_alloc_pages(CRST_ALLOC_ORDER); 46 + if (table) 47 + crst_table_init(table, val); 48 + return table; 72 49 } 73 50 74 51 pte_t __ref *vmem_pte_alloc(void) ··· 91 114 while (address < end) { 92 115 pg_dir = pgd_offset_k(address); 93 116 if (pgd_none(*pg_dir)) { 94 - p4_dir = vmem_p4d_alloc(); 117 + p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY); 95 118 if (!p4_dir) 96 119 goto out; 97 120 pgd_populate(&init_mm, pg_dir, p4_dir); 98 121 } 99 122 p4_dir = p4d_offset(pg_dir, address); 100 123 if (p4d_none(*p4_dir)) { 101 - pu_dir = vmem_pud_alloc(); 124 + pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY); 102 125 if (!pu_dir) 103 126 goto out; 104 127 p4d_populate(&init_mm, p4_dir, pu_dir); ··· 113 136 continue; 114 137 } 115 138 if (pud_none(*pu_dir)) { 116 - pm_dir = vmem_pmd_alloc(); 139 + pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY); 117 140 if (!pm_dir) 118 141 goto out; 119 142 pud_populate(&init_mm, pu_dir, pm_dir); ··· 230 253 for (address = start; address < end;) { 231 254 pg_dir = pgd_offset_k(address); 232 255 if (pgd_none(*pg_dir)) { 233 - p4_dir = vmem_p4d_alloc(); 256 + p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY); 234 257 if (!p4_dir) 235 258 goto out; 236 259 pgd_populate(&init_mm, pg_dir, p4_dir); ··· 238 261 239 262 p4_dir = p4d_offset(pg_dir, address); 240 263 if (p4d_none(*p4_dir)) { 241 - pu_dir = vmem_pud_alloc(); 264 + pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY); 242 265 if (!pu_dir) 243 266 goto out; 244 267 p4d_populate(&init_mm, p4_dir, pu_dir); ··· 246 269 247 270 pu_dir = pud_offset(p4_dir, address); 248 271 if (pud_none(*pu_dir)) { 249 - pm_dir = vmem_pmd_alloc(); 272 + pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY); 250 273 if (!pm_dir) 251 274 goto out; 252 275 pud_populate(&init_mm, pu_dir, pm_dir);