riscv: mm: call best_map_size many times during linear-mapping
authorQinglin Pan <panqinglin2020@iscas.ac.cn>
Mon, 28 Nov 2022 02:36:43 +0000 (10:36 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Fri, 9 Dec 2022 21:42:26 +0000 (13:42 -0800)
Modify the best_map_size function to give map_size many times instead
of only once, so a memory region can be mapped by both PMD_SIZE and
PAGE_SIZE.

Signed-off-by: Qinglin Pan <panqinglin2020@iscas.ac.cn>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Tested-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Link: https://lore.kernel.org/r/20221128023643.329091-1-panqinglin2020@iscas.ac.cn
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/mm/init.c

index 7d59516..bb0028c 100644 (file)
@@ -673,10 +673,11 @@ void __init create_pgd_mapping(pgd_t *pgdp,
 static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)
 {
        /* Upgrade to PMD_SIZE mappings whenever possible */
-       if ((base & (PMD_SIZE - 1)) || (size & (PMD_SIZE - 1)))
-               return PAGE_SIZE;
+       base &= PMD_SIZE - 1;
+       if (!base && size >= PMD_SIZE)
+               return PMD_SIZE;
 
-       return PMD_SIZE;
+       return PAGE_SIZE;
 }
 
 #ifdef CONFIG_XIP_KERNEL
@@ -1111,9 +1112,9 @@ static void __init setup_vm_final(void)
                if (end >= __pa(PAGE_OFFSET) + memory_limit)
                        end = __pa(PAGE_OFFSET) + memory_limit;
 
-               map_size = best_map_size(start, end - start);
                for (pa = start; pa < end; pa += map_size) {
                        va = (uintptr_t)__va(pa);
+                       map_size = best_map_size(pa, end - pa);
 
                        create_pgd_mapping(swapper_pg_dir, va, pa, map_size,
                                           pgprot_from_va(va));