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>
This commit is contained in:

committed by
Martin Schwidefsky

parent
58cdf5eb13
commit
a01ef3082d
@@ -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 @@
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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);
|
||||||
|
Reference in New Issue
Block a user