On Tue, Aug 03, 2021 at 09:42:18AM +0300, Mike Rapoport wrote:
> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
> index 8490ed2917ff..0bffd2d1854f 100644
> --- a/arch/arm64/mm/init.c
> +++ b/arch/arm64/mm/init.c
> @@ -74,6 +74,7 @@ phys_addr_t arm64_dma_phys_limit __ro_after_init;
>  static void __init reserve_crashkernel(void)
>  {
>       unsigned long long crash_base, crash_size;
> +     unsigned long long crash_max = arm64_dma_phys_limit;
>       int ret;
>  
>       ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
> @@ -84,33 +85,18 @@ static void __init reserve_crashkernel(void)
>  
>       crash_size = PAGE_ALIGN(crash_size);
>  
> -     if (crash_base == 0) {
> -             /* Current arm64 boot protocol requires 2MB alignment */
> -             crash_base = memblock_find_in_range(0, arm64_dma_phys_limit,
> -                             crash_size, SZ_2M);
> -             if (crash_base == 0) {
> -                     pr_warn("cannot allocate crashkernel (size:0x%llx)\n",
> -                             crash_size);
> -                     return;
> -             }
> -     } else {
> -             /* User specifies base address explicitly. */
> -             if (!memblock_is_region_memory(crash_base, crash_size)) {
> -                     pr_warn("cannot reserve crashkernel: region is not 
> memory\n");
> -                     return;
> -             }
> +     /* User specifies base address explicitly. */
> +     if (crash_base)
> +             crash_max = crash_base + crash_size;
>  
> -             if (memblock_is_region_reserved(crash_base, crash_size)) {
> -                     pr_warn("cannot reserve crashkernel: region overlaps 
> reserved memory\n");
> -                     return;
> -             }
> -
> -             if (!IS_ALIGNED(crash_base, SZ_2M)) {
> -                     pr_warn("cannot reserve crashkernel: base address is 
> not 2MB aligned\n");
> -                     return;
> -             }
> +     /* Current arm64 boot protocol requires 2MB alignment */
> +     crash_base = memblock_phys_alloc_range(crash_size, SZ_2M,
> +                                            crash_base, crash_max);
> +     if (!crash_base) {
> +             pr_warn("cannot allocate crashkernel (size:0x%llx)\n",
> +                     crash_size);
> +             return;
>       }
> -     memblock_reserve(crash_base, crash_size);

We'll miss a bit on debug information provided to the user in case of a
wrong crash_base/size option on the command line. Not sure we care much,
though the alignment would probably be useful (maybe we document it
somewhere).

What I haven't checked is whether memblock_phys_alloc_range() aims to
get a 2MB aligned end (size) as well. If crash_size is not 2MB aligned,
crash_max wouldn't be either and the above could fail. We only care
about the crash_base to be aligned but the memblock_phys_alloc_range()
doc says that both the start and size would be aligned to this.

-- 
Catalin
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to