• Baoquan He's avatar
    kexec_file: load kernel at top of system RAM if required · b3ba2341
    Baoquan He authored
    Patch series "kexec_file: Load kernel at top of system RAM if required".
    
    Justification:
    ==============
    
    Kexec_load interface has been doing top down searching and loading
    kernel/initrd/purgtory etc to prepare for kexec reboot.  In that way, the
    benefits are that it avoids to consume and fragment limited low memory
    which satisfy DMA buffer allocation and big chunk of continuous memory
    during system init; and avoids to stir with BIOS/FW reserved or occupied
    areas, or corner case handling/work around/quirk occupied areas when doing
    system init.  By the way, the top-down searching and loading of kexec-ed
    kernel is done in user space utility code.
    
    For kexec_file loading, even if kexec_buf.top_down is 'true', it's simply
    ignored.  It calls walk_system_ram_res() directly to go through all
    resources of System RAM bottom up, to find an available memory region,
    then call locate_mem_hole_callback() to allocate memory in that found
    memory region from top to down.  This is not expected and inconsistent
    with kexec_load.
    
    Implementation
    ===============
    
    In patch 1, introduce a new function walk_system_ram_res_rev() which is a
    variant of walk_system_ram_res(), it walks through a list of all the
    resources of System RAM in reversed order, i.e., from higher to lower.
    
    In patch 2, check if kexec_buf.top_down is 'true' in
    kexec_walk_resources(), if yes, call walk_system_ram_res_rev() to find
    memory region of system RAM from top to down to load kernel/initrd etc.
    
    Background information: ======================= And I ever tried this in
    the past in a different way, please see below link.  In the post, I tried
    to adjust struct sibling linking code, replace the the singly linked list
    with list_head so that walk_system_ram_res_rev() can be implemented in a
    much easier way.  Finally I failed. 
    https://lore.kernel.org/all/20180718024944.577-4-bhe@redhat.com/
    
    This time, I picked up the patch from AKASHI Takahiro's old post and made
    some change to take as the current patch 1:
    https://lists.infradead.org/pipermail/linux-arm-kernel/2017-September/531456.html
    
    
    This patch (of 2):
    
    Kexec_load interface has been doing top down searching and loading
    kernel/initrd/purgtory etc to prepare for kexec reboot.  In that way, the
    benefits are that it avoids to consume and fragment limited low memory
    which satisfy DMA buffer allocation and big chunk of continuous memory
    during system init; and avoids to stir with BIOS/FW reserved or occupied
    areas, or corner case handling/work around/quirk occupied areas when doing
    system init.  By the way, the top-down searching and loading of kexec-ed
    kernel is done in user space utility code.
    
    For kexec_file loading, even if kexec_buf.top_down is 'true', it's simply
    ignored.  It calls walk_system_ram_res() directly to go through all
    resources of System RAM bottom up, to find an available memory region,
    then call locate_mem_hole_callback() to allocate memory in that found
    memory region from top to down.  This is not expected and inconsistent
    with kexec_load.
    
    Here check if kexec_buf.top_down is 'true' in kexec_walk_resources(), if
    yes, call the newly added walk_system_ram_res_rev() to find memory region
    of system RAM from top to down to load kernel/initrd etc.
    
    Link: https://lkml.kernel.org/r/20231114091658.228030-1-bhe@redhat.com
    Link: https://lkml.kernel.org/r/20231114091658.228030-3-bhe@redhat.comSigned-off-by: default avatarBaoquan He <bhe@redhat.com>
    Cc: AKASHI Takahiro <takahiro.akashi@linaro.org>
    Cc: Baoquan He <bhe@redhat.com>
    Cc: Eric Biederman <ebiederm@xmission.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    b3ba2341
kexec_file.c 28.4 KB