Re: [PATCH v2] Do not reserve crashkernel high memory if crashkernel low memory reserving failed

From: Yinghai Lu
Date: Mon Jul 27 2015 - 14:32:14 EST


On Tue, Jul 21, 2015 at 12:31 AM, Dave Young <dyoung@xxxxxxxxxx> wrote:
>> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
>> index 80f874b..36aeac3 100644
>> --- a/arch/x86/kernel/setup.c
>> +++ b/arch/x86/kernel/setup.c
>> @@ -513,7 +513,7 @@ static void __init memblock_x86_reserve_range_setup_data(void)
>> # define CRASH_KERNEL_ADDR_HIGH_MAX MAXMEM
>> #endif
>>
>> -static void __init reserve_crashkernel_low(void)
>> +static int __init reserve_crashkernel_low(void)
>> {
>> #ifdef CONFIG_X86_64
>> const unsigned long long alignment = 16<<20; /* 16M */
>> @@ -542,7 +542,7 @@ static void __init reserve_crashkernel_low(void)
>> } else {
>> /* passed with crashkernel=0,low ? */
>> if (!low_size)
>> - return;
>> + return 0;
>> }
>>
>> low_base = memblock_find_in_range(low_size, (1ULL<<32),
>> @@ -552,7 +552,7 @@ static void __init reserve_crashkernel_low(void)
>> if (!auto_set)
>> pr_info("crashkernel low reservation failed - No suitable area found.\n");
>>
>> - return;
>> + return -EINVAL;
>> }
>>
>> memblock_reserve(low_base, low_size);
>> @@ -564,6 +564,7 @@ static void __init reserve_crashkernel_low(void)
>> crashk_low_res.end = low_base + low_size - 1;
>> insert_resource(&iomem_resource, &crashk_low_res);
>> #endif
>> + return 0;
>> }
>>
>> static void __init reserve_crashkernel(void)
>> @@ -613,6 +614,10 @@ static void __init reserve_crashkernel(void)
>> return;
>> }
>> }
>> +
>> + if (crash_base >= (1ULL<<32) && reserve_crashkernel_low())
>> + return;
>> +
>> memblock_reserve(crash_base, crash_size);
>>
>> printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
>> @@ -624,9 +629,6 @@ static void __init reserve_crashkernel(void)
>> crashk_res.start = crash_base;
>> crashk_res.end = crash_base + crash_size - 1;
>> insert_resource(&iomem_resource, &crashk_res);
>> -
>> - if (crash_base >= (1ULL<<32))
>> - reserve_crashkernel_low();
>> }
>> #else
>> static void __init reserve_crashkernel(void)

No, you can not move the calling position for reserve_crashkernel_low().

old sequence:

memblock_find_in_range for high
memblock_reserve for high
memblock_find_in_range for low
memblock_reserve for low

now you change to:
memblock_find_in_range for high
memblock_find_in_range for low
memblock_reserve for low
memblock_reserve for high

during memblock_reserve, we would double the memblock reserve array.
So there is possibility that new membock reserve array is overlapped with
range for crashdump high.

so you should keep the old sequence, and if reserve_crashkernel_low fail,
just call memblock_free to free high range that is reserved before.

Thanks

Yinghai
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/