lkml.org 
[lkml]   [2021]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/18] arm64: kexec: flush image and lists during kexec load time
    Date
    Currently, during kexec load we are copying relocation function and
    flushing it. However, we can also flush kexec relocation buffers and
    if new kernel image is already in place (i.e. crash kernel), we can
    also flush the new kernel image itself.

    Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
    ---
    arch/arm64/kernel/machine_kexec.c | 49 +++++++++++++++----------------
    1 file changed, 23 insertions(+), 26 deletions(-)

    diff --git a/arch/arm64/kernel/machine_kexec.c b/arch/arm64/kernel/machine_kexec.c
    index 90a335c74442..3a034bc25709 100644
    --- a/arch/arm64/kernel/machine_kexec.c
    +++ b/arch/arm64/kernel/machine_kexec.c
    @@ -59,23 +59,6 @@ void machine_kexec_cleanup(struct kimage *kimage)
    /* Empty routine needed to avoid build errors. */
    }

    -int machine_kexec_post_load(struct kimage *kimage)
    -{
    - void *reloc_code = page_to_virt(kimage->control_code_page);
    -
    - memcpy(reloc_code, arm64_relocate_new_kernel,
    - arm64_relocate_new_kernel_size);
    - kimage->arch.kern_reloc = __pa(reloc_code);
    - kexec_image_info(kimage);
    -
    - /* Flush the reloc_code in preparation for its execution. */
    - __flush_dcache_area(reloc_code, arm64_relocate_new_kernel_size);
    - flush_icache_range((uintptr_t)reloc_code, (uintptr_t)reloc_code +
    - arm64_relocate_new_kernel_size);
    -
    - return 0;
    -}
    -
    /**
    * machine_kexec_prepare - Prepare for a kexec reboot.
    *
    @@ -152,6 +135,29 @@ static void kexec_segment_flush(const struct kimage *kimage)
    }
    }

    +int machine_kexec_post_load(struct kimage *kimage)
    +{
    + void *reloc_code = page_to_virt(kimage->control_code_page);
    +
    + /* If in place flush new kernel image, else flush lists and buffers */
    + if (kimage->head & IND_DONE)
    + kexec_segment_flush(kimage);
    + else
    + kexec_list_flush(kimage);
    +
    + memcpy(reloc_code, arm64_relocate_new_kernel,
    + arm64_relocate_new_kernel_size);
    + kimage->arch.kern_reloc = __pa(reloc_code);
    + kexec_image_info(kimage);
    +
    + /* Flush the reloc_code in preparation for its execution. */
    + __flush_dcache_area(reloc_code, arm64_relocate_new_kernel_size);
    + flush_icache_range((uintptr_t)reloc_code, (uintptr_t)reloc_code +
    + arm64_relocate_new_kernel_size);
    +
    + return 0;
    +}
    +
    /**
    * machine_kexec - Do the kexec reboot.
    *
    @@ -169,13 +175,6 @@ void machine_kexec(struct kimage *kimage)
    WARN(in_kexec_crash && (stuck_cpus || smp_crash_stop_failed()),
    "Some CPUs may be stale, kdump will be unreliable.\n");

    - /* Flush the kimage list and its buffers. */
    - kexec_list_flush(kimage);
    -
    - /* Flush the new image if already in place. */
    - if ((kimage != kexec_crash_image) && (kimage->head & IND_DONE))
    - kexec_segment_flush(kimage);
    -
    pr_info("Bye!\n");

    local_daif_mask();
    @@ -250,8 +249,6 @@ void arch_kexec_protect_crashkres(void)
    {
    int i;

    - kexec_segment_flush(kexec_crash_image);
    -
    for (i = 0; i < kexec_crash_image->nr_segments; i++)
    set_memory_valid(
    __phys_to_virt(kexec_crash_image->segment[i].mem),
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-05-27 17:06    [W:4.125 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site