lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 049/108] x86: handle initrd that extends into unusable memory
    2.6.30-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Yinghai Lu <yinghai@kernel.org>

    commit 8c5dd8f43367f4f266dd616f11658005bc2d20ef upstream.

    On a system where system memory (according e820) is not covered by
    mtrr, mtrr_trim_memory converts a portion of memory to reserved, but
    bootloader has already put the initrd in that range.

    Thus, we need to have 64bit to use relocate_initrd too.

    [ Impact: fix using initrd when mtrr_trim_memory happen ]

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/kernel/setup.c | 15 +++------------
    1 file changed, 3 insertions(+), 12 deletions(-)

    --- a/arch/x86/kernel/setup.c
    +++ b/arch/x86/kernel/setup.c
    @@ -293,15 +293,13 @@ static void __init reserve_brk(void)

    #ifdef CONFIG_BLK_DEV_INITRD

    -#ifdef CONFIG_X86_32
    -
    #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT)
    static void __init relocate_initrd(void)
    {

    u64 ramdisk_image = boot_params.hdr.ramdisk_image;
    u64 ramdisk_size = boot_params.hdr.ramdisk_size;
    - u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
    + u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
    u64 ramdisk_here;
    unsigned long slop, clen, mapaddr;
    char *p, *q;
    @@ -357,14 +355,13 @@ static void __init relocate_initrd(void)
    ramdisk_image, ramdisk_image + ramdisk_size - 1,
    ramdisk_here, ramdisk_here + ramdisk_size - 1);
    }
    -#endif

    static void __init reserve_initrd(void)
    {
    u64 ramdisk_image = boot_params.hdr.ramdisk_image;
    u64 ramdisk_size = boot_params.hdr.ramdisk_size;
    u64 ramdisk_end = ramdisk_image + ramdisk_size;
    - u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
    + u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;

    if (!boot_params.hdr.type_of_loader ||
    !ramdisk_image || !ramdisk_size)
    @@ -394,14 +391,8 @@ static void __init reserve_initrd(void)
    return;
    }

    -#ifdef CONFIG_X86_32
    relocate_initrd();
    -#else
    - printk(KERN_ERR "initrd extends beyond end of memory "
    - "(0x%08llx > 0x%08llx)\ndisabling initrd\n",
    - ramdisk_end, end_of_lowmem);
    - initrd_start = 0;
    -#endif
    +
    free_early(ramdisk_image, ramdisk_end);
    }
    #else



    \
     
     \ /
      Last update: 2009-07-01 03:33    [W:0.025 / U:31.412 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site