lkml.org 
[lkml]   [2009]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH] x86: crash kernel reserve with reserve_early
    From

    [PATCH] x86: crash kernel reserve with reserve_early

    use find_e820_area/reserve_early instead.
    will get next good one automatically with alignment

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    arch/x86/kernel/setup.c | 60 ++++++++++--------------------------------------
    1 file changed, 13 insertions(+), 47 deletions(-)

    Index: linux-2.6/arch/x86/kernel/setup.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/setup.c
    +++ linux-2.6/arch/x86/kernel/setup.c
    @@ -488,42 +488,11 @@ static void __init reserve_early_setup_d

    #ifdef CONFIG_KEXEC

    -/**
    - * Reserve @size bytes of crashkernel memory at any suitable offset.
    - *
    - * @size: Size of the crashkernel memory to reserve.
    - * Returns the base address on success, and -1ULL on failure.
    - */
    -static
    -unsigned long long __init find_and_reserve_crashkernel(unsigned long long size)
    -{
    - const unsigned long long alignment = 16<<20; /* 16M */
    - unsigned long long start = 0LL;
    -
    - while (1) {
    - int ret;
    -
    - start = find_e820_area(start, ULONG_MAX, size, alignment);
    - if (start == -1ULL)
    - return start;
    -
    - /* try to reserve it */
    - ret = reserve_bootmem_generic(start, size, BOOTMEM_EXCLUSIVE);
    - if (ret >= 0)
    - return start;
    -
    - start += alignment;
    - }
    -}
    -
    static inline unsigned long long get_total_mem(void)
    {
    unsigned long long total;

    - total = max_low_pfn - min_low_pfn;
    -#ifdef CONFIG_HIGHMEM
    - total += highend_pfn - highstart_pfn;
    -#endif
    + total = max_pfn - min_low_pfn;

    return total << PAGE_SHIFT;
    }
    @@ -532,6 +501,8 @@ static void __init reserve_crashkernel(v
    {
    unsigned long long total_mem;
    unsigned long long crash_size, crash_base;
    + const unsigned long long alignment = 16<<20; /* 16M */
    + unsigned long long start;
    int ret;

    total_mem = get_total_mem();
    @@ -543,21 +514,16 @@ static void __init reserve_crashkernel(v

    /* 0 means: find the address automatically */
    if (crash_base <= 0) {
    - crash_base = find_and_reserve_crashkernel(crash_size);
    - if (crash_base == -1ULL) {
    - pr_info("crashkernel reservation failed. "
    - "No suitable area found.\n");
    - return;
    - }
    + start = alignment;
    } else {
    - ret = reserve_bootmem_generic(crash_base, crash_size,
    - BOOTMEM_EXCLUSIVE);
    - if (ret < 0) {
    - pr_info("crashkernel reservation failed - "
    - "memory is in use\n");
    - return;
    - }
    + start = crash_base;
    + }
    + crash_base = find_e820_area(start, ULONG_MAX, crash_size, alignment);
    + if (crash_base == -1ULL) {
    + pr_info("crashkernel reservation failed - No suitable area found.\n");
    + return;
    }
    + reserve_early(crash_base, crash_base + crash_size, "CRASH KERNEL");

    printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
    "for crashkernel (System RAM: %ldMB)\n",
    @@ -935,6 +901,8 @@ void __init setup_arch(char **cmdline_p)

    reserve_initrd();

    + reserve_crashkernel();
    +
    vsmp_init();

    io_delay_init();
    @@ -965,8 +933,6 @@ void __init setup_arch(char **cmdline_p)

    initmem_init(0, max_pfn, acpi, k8);

    - reserve_crashkernel();
    -
    #ifdef CONFIG_X86_64
    /*
    * dma32_reserve_bootmem() allocates bootmem which may conflict
    \
     
     \ /
      Last update: 2009-11-22 11:29    [W:0.025 / U:126.204 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site