[PATCH v1 1/1] riscv: mm: call best_map_size many times during linear-mapping

Alexandre Ghiti alex at ghiti.fr
Tue Nov 15 07:38:37 PST 2022


Hi Qinglin,

On 06/10/2022 04:12, panqinglin2020 at iscas.ac.cn wrote:
> From: Qinglin Pan <panqinglin2020 at iscas.ac.cn>
>
> 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 at iscas.ac.cn>
> ---
>   arch/riscv/mm/init.c | 9 +++++----
>   1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
> index b56a0a75533f..1b76d3fe4e26 100644
> --- a/arch/riscv/mm/init.c
> +++ b/arch/riscv/mm/init.c
> @@ -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));


It works fine for me, so you can add:

Reviewed-by: Alexandre Ghiti <alexghiti at rivosinc.com>
Tested-by: Alexandre Ghiti <alexghiti at rivosinc.com>

FYI, I'm working right now on using hugepages of 1GB for the linear mapping.

Thanks,

Alex




More information about the linux-riscv mailing list