s390/mm,vmem: simplify region and segment table allocation code
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 16 Jun 2017 15:51:15 +0000 (17:51 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 26 Jul 2017 06:25:12 +0000 (08:25 +0200)
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>
arch/s390/include/asm/pgalloc.h
arch/s390/include/asm/pgtable.h
arch/s390/mm/pageattr.c
arch/s390/mm/vmem.c

index ead67a3..a0d9167 100644 (file)
@@ -160,4 +160,8 @@ static inline void pmd_populate(struct mm_struct *mm,
 
 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 */
index 90f422f..c9560e0 100644 (file)
@@ -21,9 +21,6 @@
 
 extern pgd_t swapper_pg_dir[];
 extern void paging_init(void);
-extern void vmem_map_init(void);
-pmd_t *vmem_pmd_alloc(void);
-pte_t *vmem_pte_alloc(void);
 
 enum {
        PG_DIRECT_MAP_4K = 0,
index 567fe92..552f898 100644 (file)
@@ -7,6 +7,7 @@
 #include <asm/cacheflush.h>
 #include <asm/facility.h>
 #include <asm/pgtable.h>
+#include <asm/pgalloc.h>
 #include <asm/page.h>
 #include <asm/set_memory.h>
 
@@ -191,7 +192,7 @@ static int split_pud_page(pud_t *pudp, unsigned long addr)
        pud_t new;
        int i, ro, nx;
 
-       pm_dir = vmem_pmd_alloc();
+       pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
        if (!pm_dir)
                return -ENOMEM;
        pmd_addr = pud_pfn(*pudp) << PAGE_SHIFT;
index d839896..c0af0d7 100644 (file)
@@ -38,37 +38,14 @@ static void __ref *vmem_alloc_pages(unsigned int order)
        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);
-       if (!p4d)
-               return NULL;
-       clear_table((unsigned long *) p4d, _REGION2_ENTRY_EMPTY, PAGE_SIZE * 4);
-       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;
+       table = vmem_alloc_pages(CRST_ALLOC_ORDER);
+       if (table)
+               crst_table_init(table, val);
+       return table;
 }
 
 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) {
                pg_dir = pgd_offset_k(address);
                if (pgd_none(*pg_dir)) {
-                       p4_dir = vmem_p4d_alloc();
+                       p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY);
                        if (!p4_dir)
                                goto out;
                        pgd_populate(&init_mm, pg_dir, p4_dir);
                }
                p4_dir = p4d_offset(pg_dir, address);
                if (p4d_none(*p4_dir)) {
-                       pu_dir = vmem_pud_alloc();
+                       pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY);
                        if (!pu_dir)
                                goto out;
                        p4d_populate(&init_mm, p4_dir, pu_dir);
@@ -136,7 +113,7 @@ static int vmem_add_mem(unsigned long start, unsigned long size)
                        continue;
                }
                if (pud_none(*pu_dir)) {
-                       pm_dir = vmem_pmd_alloc();
+                       pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
                        if (!pm_dir)
                                goto out;
                        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;) {
                pg_dir = pgd_offset_k(address);
                if (pgd_none(*pg_dir)) {
-                       p4_dir = vmem_p4d_alloc();
+                       p4_dir = vmem_crst_alloc(_REGION2_ENTRY_EMPTY);
                        if (!p4_dir)
                                goto out;
                        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);
                if (p4d_none(*p4_dir)) {
-                       pu_dir = vmem_pud_alloc();
+                       pu_dir = vmem_crst_alloc(_REGION3_ENTRY_EMPTY);
                        if (!pu_dir)
                                goto out;
                        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);
                if (pud_none(*pu_dir)) {
-                       pm_dir = vmem_pmd_alloc();
+                       pm_dir = vmem_crst_alloc(_SEGMENT_ENTRY_EMPTY);
                        if (!pm_dir)
                                goto out;
                        pud_populate(&init_mm, pu_dir, pm_dir);