[PATCH v2] MIPS: replace add_memory_region with memblock

Serge Semin fancer.lancer at gmail.com
Thu Oct 8 11:20:06 EDT 2020


Hello Thomas

On Thu, Oct 08, 2020 at 10:43:54AM +0200, Thomas Bogendoerfer wrote:
> add_memory_region was the old interface for registering memory and
> was already changed to used memblock internaly. Replace it by
> directly calling memblock functions.

Thanks for suggesting this cleanup. It's great to see that the leftover of the
old bootmem and MIPS-specific boot_mem_map framework time is going to be finally
removed. A few comments are blow.

> 
> Signed-off-by: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
> ---
> Changes in v2:
> 	fixed missing memblock include in fw/sni/sniprom.c
> 	tested on cobalt, IP22, IP28, IP30, IP32, JAZZ, SNI

...

> diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c
> index 9e50dc8df2f6..fab532cb5a11 100644
> --- a/arch/mips/kernel/prom.c
> +++ b/arch/mips/kernel/prom.c
> @@ -50,14 +50,18 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
>  		size = PHYS_ADDR_MAX - base;
>  	}
>  
> -	add_memory_region(base, size, BOOT_MEM_RAM);
> +	memblock_add(base, size);
>  }
>  
>  int __init early_init_dt_reserve_memory_arch(phys_addr_t base,
>  					phys_addr_t size, bool nomap)
>  {
> -	add_memory_region(base, size,
> -			  nomap ? BOOT_MEM_NOMAP : BOOT_MEM_RESERVED);
> +	if (nomap) {
> +		memblock_remove(base, size);
> +	} else {
> +		memblock_add(base, size);
> +		memblock_reserve(base, size);
> +	}
>  
>  	return 0;
>  }

I guess originally the arch-specific early_init_dt_add_memory_arch() and
early_init_dt_reserve_memory_arch() methods have been added since MIPS's got its
own memory types declarations (BOOT_MEM_RAM, BOOT_MEM_RESERVED, etc) and had had
a specific internal system memory regions mapping (add_memory_region(),
boot_mem_map, etc). Since the leftover of that framework is going to be removed,
we can freely use the standard early_init_dt_add_memory_arch() and
early_init_dt_reserve_memory_arch() implementations from drivers/of/fdt.c:1102
drivers/of/fdt.c:1149 .

At least I don't see a decent reason to preserve them. The memory registration
method does nearly the same sanity checks. The memory reservation function
defers a bit in adding the being reserved memory first. That seems redundant,
since the reserved memory won't be available for the system anyway. Do I miss
something?

> diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
> index 4c04a86f075b..fb05b66e111f 100644
> --- a/arch/mips/kernel/setup.c
> +++ b/arch/mips/kernel/setup.c
> @@ -91,45 +91,6 @@ unsigned long ARCH_PFN_OFFSET;
>  EXPORT_SYMBOL(ARCH_PFN_OFFSET);
>  #endif
>  
> -void __init add_memory_region(phys_addr_t start, phys_addr_t size, long type)
> -{
> -	/*
> -	 * Note: This function only exists for historical reason,
> -	 * new code should use memblock_add or memblock_add_node instead.
> -	 */
> -
> -	/*
> -	 * If the region reaches the top of the physical address space, adjust
> -	 * the size slightly so that (start + size) doesn't overflow
> -	 */
> -	if (start + size - 1 == PHYS_ADDR_MAX)
> -		--size;
> -
> -	/* Sanity check */
> -	if (start + size < start) {
> -		pr_warn("Trying to add an invalid memory region, skipped\n");
> -		return;
> -	}
> -
> -	if (start < PHYS_OFFSET)
> -		return;
> -
> -	memblock_add(start, size);
> -	/* Reserve any memory except the ordinary RAM ranges. */
> -	switch (type) {
> -	case BOOT_MEM_RAM:
> -		break;
> -
> -	case BOOT_MEM_NOMAP: /* Discard the range from the system. */
> -		memblock_remove(start, size);
> -		break;
> -
> -	default: /* Reserve the rest of the memory types at boot time */
> -		memblock_reserve(start, size);
> -		break;
> -	}
> -}
> -
>  void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_addr_t sz_max)
>  {
>  	void *dm = &detect_magic;
> @@ -146,7 +107,7 @@ void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_add
>  		((unsigned long long) sz_min) / SZ_1M,
>  		((unsigned long long) sz_max) / SZ_1M);
>  
> -	add_memory_region(start, size, BOOT_MEM_RAM);
> +	memblock_add(start, size);
>  }
>  
>  /*
> @@ -400,7 +361,7 @@ static int __init early_parse_mem(char *p)
>  	if (*p == '@')
>  		start = memparse(p + 1, &p);
>  
> -	add_memory_region(start, size, BOOT_MEM_RAM);
> +	memblock_add(start, size);
>  
>  	return 0;
>  }
> @@ -426,13 +387,14 @@ static int __init early_parse_memmap(char *p)
>  
>  	if (*p == '@') {
>  		start_at = memparse(p+1, &p);
> -		add_memory_region(start_at, mem_size, BOOT_MEM_RAM);
> +		memblock_add(start_at, mem_size);
>  	} else if (*p == '#') {
>  		pr_err("\"memmap=nn#ss\" (force ACPI data) invalid on MIPS\n");
>  		return -EINVAL;
>  	} else if (*p == '$') {
>  		start_at = memparse(p+1, &p);

> -		add_memory_region(start_at, mem_size, BOOT_MEM_RESERVED);
> +		memblock_add(start_at, mem_size);
> +		memblock_reserve(start_at, mem_size);

I suppose we could remove the memory addition from here too. What do you think?

>  	} else {
>  		pr_err("\"memmap\" invalid format!\n");
>  		return -EINVAL;
> @@ -644,7 +606,7 @@ static void __init bootcmdline_init(void)
>   * arch_mem_init - initialize memory management subsystem
>   *
>   *  o plat_mem_setup() detects the memory configuration and will record detected
> - *    memory areas using add_memory_region.
> + *    memory areas using memblock_add.
>   *
>   * At this stage the memory configuration of the system is known to the
>   * kernel but generic memory management system is still entirely uninitialized.
> diff --git a/arch/mips/loongson2ef/common/mem.c b/arch/mips/loongson2ef/common/mem.c
> index ae21f1c62baa..057d58bb470e 100644
> --- a/arch/mips/loongson2ef/common/mem.c
> +++ b/arch/mips/loongson2ef/common/mem.c
> @@ -17,10 +17,7 @@ u32 memsize, highmemsize;
>  
>  void __init prom_init_memory(void)
>  {

> -	add_memory_region(0x0, (memsize << 20), BOOT_MEM_RAM);
> -
> -	add_memory_region(memsize << 20, LOONGSON_PCI_MEM_START - (memsize <<
> -				20), BOOT_MEM_RESERVED);
> +	memblock_add(0x0, (memsize << 20));

Hm, am I missing something or the BOOT_MEM_RESERVED part has been discarded?

>  
>  #ifdef CONFIG_CPU_SUPPORTS_ADDRWINCFG
>  	{
> @@ -41,12 +38,7 @@ void __init prom_init_memory(void)
>  
>  #ifdef CONFIG_64BIT
>  	if (highmemsize > 0)

> -		add_memory_region(LOONGSON_HIGHMEM_START,
> -				  highmemsize << 20, BOOT_MEM_RAM);
> -
> -	add_memory_region(LOONGSON_PCI_MEM_END + 1, LOONGSON_HIGHMEM_START -
> -			  LOONGSON_PCI_MEM_END - 1, BOOT_MEM_RESERVED);
> -
> +		memblock_add(LOONGSON_HIGHMEM_START, highmemsize << 20);

The same question. Is it ok to discard the
[LOONGSON_PCI_MEM_END+1:LOONGSON_HIGHMEM_START-LOONGSON_PCI_MEM_END-1] region
removal operation?

-Sergey

>  #endif /* !CONFIG_64BIT */
>  }
>  



More information about the linux-arm-kernel mailing list