From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753432AbbG0Sbh (ORCPT ); Mon, 27 Jul 2015 14:31:37 -0400 Received: from mail-ig0-f171.google.com ([209.85.213.171]:33703 "EHLO mail-ig0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750803AbbG0Sbg (ORCPT ); Mon, 27 Jul 2015 14:31:36 -0400 MIME-Version: 1.0 In-Reply-To: <20150721073123.GA30649@dhcp-129-220.nay.redhat.com> References: <1437304064-9916-1-git-send-email-bhe@redhat.com> <20150719145320.GB9968@dhcp-17-102.nay.redhat.com> <20150721073123.GA30649@dhcp-129-220.nay.redhat.com> Date: Mon, 27 Jul 2015 11:31:34 -0700 X-Google-Sender-Auth: vOcytZYfaTZdN1sbdmidHceXSTQ Message-ID: Subject: Re: [PATCH v2] Do not reserve crashkernel high memory if crashkernel low memory reserving failed From: Yinghai Lu To: Dave Young Cc: Baoquan He , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Borislav Petkov , Andrew Morton , Jiri Kosina , Vivek Goyal , Linux Kernel Mailing List Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jul 21, 2015 at 12:31 AM, Dave Young 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