Revert "s390/mm: get rid of VMEM_MAX_PHYS macro"
authorAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 4 Jul 2023 05:46:26 +0000 (07:46 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 4 Jul 2023 05:46:26 +0000 (07:46 +0200)
This reverts commit 456be42aa713e7f83b467db66ceae779431c7d9d.

The assumption VMEM_MAX_PHYS should match ident_map_size
is wrong. At least discontiguous saved segments (DCSS)
could be loaded at addresses beyond ident_map_size and
dcssblk device driver might fail as result.

Reported-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/boot/startup.c
arch/s390/include/asm/pgtable.h
arch/s390/mm/extmem.c
arch/s390/mm/vmem.c
drivers/s390/char/sclp_cmd.c

index de264a2..64bd7ac 100644 (file)
@@ -220,6 +220,7 @@ static unsigned long setup_kernel_memory_layout(void)
        pages = SECTION_ALIGN_UP(pages);
        /* keep vmemmap_start aligned to a top level region table entry */
        vmemmap_start = round_down(VMALLOC_START - pages * sizeof(struct page), rte_size);
+       /* vmemmap_start is the future VMEM_MAX_PHYS, make sure it is within MAX_PHYSMEM */
        vmemmap_start = min(vmemmap_start, 1UL << MAX_PHYSMEM_BITS);
        /* make sure identity map doesn't overlay with vmemmap */
        ident_map_size = min(ident_map_size, vmemmap_start);
index 30909fe..c55f3c3 100644 (file)
@@ -89,6 +89,8 @@ extern unsigned long __bootdata_preserved(VMALLOC_END);
 extern struct page *__bootdata_preserved(vmemmap);
 extern unsigned long __bootdata_preserved(vmemmap_size);
 
+#define VMEM_MAX_PHYS ((unsigned long) vmemmap)
+
 extern unsigned long __bootdata_preserved(MODULES_VADDR);
 extern unsigned long __bootdata_preserved(MODULES_END);
 #define MODULES_VADDR  MODULES_VADDR
index f4d3719..1bc42ce 100644 (file)
@@ -642,7 +642,7 @@ void segment_warning(int rc, char *seg_name)
                break;
        case -ERANGE:
                pr_err("DCSS %s exceeds the kernel mapping range (%lu) "
-                      "and cannot be loaded\n", seg_name, ident_map_size);
+                      "and cannot be loaded\n", seg_name, VMEM_MAX_PHYS);
                break;
        default:
                break;
index 9db048c..b266492 100644 (file)
@@ -531,7 +531,7 @@ struct range arch_get_mappable_range(void)
        struct range mhp_range;
 
        mhp_range.start = 0;
-       mhp_range.end = ident_map_size - 1;
+       mhp_range.end =  VMEM_MAX_PHYS - 1;
        return mhp_range;
 }
 
index 594b34c..3c87057 100644 (file)
@@ -392,10 +392,10 @@ static void __init add_memory_merged(u16 rn)
                goto skip_add;
        start = rn2addr(first_rn);
        size = (unsigned long long) num * sclp.rzm;
-       if (start >= ident_map_size)
+       if (start >= VMEM_MAX_PHYS)
                goto skip_add;
-       if (start + size > ident_map_size)
-               size = ident_map_size - start;
+       if (start + size > VMEM_MAX_PHYS)
+               size = VMEM_MAX_PHYS - start;
        if (start >= ident_map_size)
                goto skip_add;
        if (start + size > ident_map_size)