Commit a01ef308 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

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

Reviewed-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Reviewed-by: default avatarJanosch Frank <frankja@linux.vnet.ibm.com>
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 58cdf5eb
...@@ -160,4 +160,8 @@ static inline void pmd_populate(struct mm_struct *mm, ...@@ -160,4 +160,8 @@ static inline void pmd_populate(struct mm_struct *mm,
extern void rcu_table_freelist_finish(void); extern void rcu_table_freelist_finish(void);
void vmem_map_init(void);
void *vmem_crst_alloc(unsigned long val);
pte_t *vmem_pte_alloc(void);
#endif /* _S390_PGALLOC_H */ #endif /* _S390_PGALLOC_H */
...@@ -21,9 +21,6 @@ ...@@ -21,9 +21,6 @@
extern pgd_t swapper_pg_dir[]; extern pgd_t swapper_pg_dir[];
extern void paging_init(void); extern void paging_init(void);
extern void vmem_map_init(void);
pmd_t *vmem_pmd_alloc(void);
pte_t *vmem_pte_alloc(void);
enum { enum {
PG_DIRECT_MAP_4K = 0, PG_DIRECT_MAP_4K = 0,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/facility.h> #include <asm/facility.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/pgalloc.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/set_memory.h> #include <asm/set_memory.h>
...@@ -191,7 +192,7 @@ static int split_pud_page(pud_t *pudp, unsigned long addr) ...@@ -191,7 +192,7 @@ static int split_pud_page(pud_t *pudp, unsigned long addr)
pud_t new; pud_t new;
int i, ro, nx; int i, ro, nx;
pm_dir = vmem_pmd_alloc(); pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
if (!pm_dir) if (!pm_dir)
return -ENOMEM; return -ENOMEM;
pmd_addr = pud_pfn(*pudp) << PAGE_SHIFT; pmd_addr = pud_pfn(*pudp) << PAGE_SHIFT;
......
...@@ -38,37 +38,14 @@ static void __ref *vmem_alloc_pages(unsigned int order) ...@@ -38,37 +38,14 @@ static void __ref *vmem_alloc_pages(unsigned int order)
return (void *) memblock_alloc(size, size); return (void *) memblock_alloc(size, size);
} }
static inline p4d_t *vmem_p4d_alloc(void) void *vmem_crst_alloc(unsigned long val)
{ {
p4d_t *p4d = NULL; unsigned long *table;
p4d = vmem_alloc_pages(2); table = vmem_alloc_pages(CRST_ALLOC_ORDER);
if (!p4d) if (table)
return NULL; crst_table_init(table, val);
clear_table((unsigned long *) p4d, _REGION2_ENTRY_EMPTY, PAGE_SIZE * 4); return table;
return p4d;
}
static inline pud_t *vmem_pud_alloc(void)
{
pud_t *pud = NULL;
pud = vmem_alloc_pages(2);
if (!pud)
return NULL;
clear_table((unsigned long *) pud, _REGION3_ENTRY_EMPTY, PAGE_SIZE * 4);
return pud;
}
pmd_t *vmem_pmd_alloc(void)
{
pmd_t *pmd = NULL;
pmd = vmem_alloc_pages(2);
if (!pmd)
return NULL;
clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE * 4);
return pmd;
} }
pte_t __ref *vmem_pte_alloc(void) pte_t __ref *vmem_pte_alloc(void)
...@@ -114,14 +91,14 @@ static int vmem_add_mem(unsigned long start, unsigned long size) ...@@ -114,14 +91,14 @@ static int vmem_add_mem(unsigned long start, unsigned long size)
while (address < end) { while (address < end) {
pg_dir = pgd_offset_k(address); pg_dir = pgd_offset_k(address);
if (pgd_none(*pg_dir)) { if (pgd_none(*pg_dir)) {
p4_dir = vmem_p4d_alloc(); p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY);
if (!p4_dir) if (!p4_dir)
goto out; goto out;
pgd_populate(&init_mm, pg_dir, p4_dir); pgd_populate(&init_mm, pg_dir, p4_dir);
} }
p4_dir = p4d_offset(pg_dir, address); p4_dir = p4d_offset(pg_dir, address);
if (p4d_none(*p4_dir)) { if (p4d_none(*p4_dir)) {
pu_dir = vmem_pud_alloc(); pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY);
if (!pu_dir) if (!pu_dir)
goto out; goto out;
p4d_populate(&init_mm, p4_dir, pu_dir); p4d_populate(&init_mm, p4_dir, pu_dir);
...@@ -136,7 +113,7 @@ static int vmem_add_mem(unsigned long start, unsigned long size) ...@@ -136,7 +113,7 @@ static int vmem_add_mem(unsigned long start, unsigned long size)
continue; continue;
} }
if (pud_none(*pu_dir)) { if (pud_none(*pu_dir)) {
pm_dir = vmem_pmd_alloc(); pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
if (!pm_dir) if (!pm_dir)
goto out; goto out;
pud_populate(&init_mm, pu_dir, pm_dir); pud_populate(&init_mm, pu_dir, pm_dir);
...@@ -253,7 +230,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) ...@@ -253,7 +230,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
for (address = start; address < end;) { for (address = start; address < end;) {
pg_dir = pgd_offset_k(address); pg_dir = pgd_offset_k(address);
if (pgd_none(*pg_dir)) { if (pgd_none(*pg_dir)) {
p4_dir = vmem_p4d_alloc(); p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY);
if (!p4_dir) if (!p4_dir)
goto out; goto out;
pgd_populate(&init_mm, pg_dir, p4_dir); pgd_populate(&init_mm, pg_dir, p4_dir);
...@@ -261,7 +238,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) ...@@ -261,7 +238,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
p4_dir = p4d_offset(pg_dir, address); p4_dir = p4d_offset(pg_dir, address);
if (p4d_none(*p4_dir)) { if (p4d_none(*p4_dir)) {
pu_dir = vmem_pud_alloc(); pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY);
if (!pu_dir) if (!pu_dir)
goto out; goto out;
p4d_populate(&init_mm, p4_dir, pu_dir); p4d_populate(&init_mm, p4_dir, pu_dir);
...@@ -269,7 +246,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) ...@@ -269,7 +246,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
pu_dir = pud_offset(p4_dir, address); pu_dir = pud_offset(p4_dir, address);
if (pud_none(*pu_dir)) { if (pud_none(*pu_dir)) {
pm_dir = vmem_pmd_alloc(); pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
if (!pm_dir) if (!pm_dir)
goto out; goto out;
pud_populate(&init_mm, pu_dir, pm_dir); pud_populate(&init_mm, pu_dir, pm_dir);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment