[PATCH] makedumpfile: call initial before use cache

Lichen Liu lichliu at redhat.com
Tue Jul 23 00:31:19 PDT 2024


Yes, it works!
Thank you so much!

On Mon, Jul 22, 2024 at 2:46 PM HAGIO KAZUHITO(萩尾 一仁)
<k-hagio-ab at nec.com> wrote:
>
> On 2024/07/20 16:38, Lichen Liu wrote:
>
> >> This will work only for 4.19 and later kernels, but might reduce users
> >> that hit the issue.  Does this work for you?
> > That works for me because I'm testing for the 6.x kernel.
>
> Thanks for the check.  Is the issue a segmentation fault?
> I've made a patch below, is this OK?
>
>
>  From 084742cba5b81da563074454ab8c879e8e411cb0 Mon Sep 17 00:00:00 2001
> From: Kazuhito Hagio <k-hagio-ab at nec.com>
> Date: Mon, 22 Jul 2024 14:31:43 +0900
> Subject: [PATCH] Workaround for segfault by "makedumpfile --mem-usage" on PPC64
>
> "makedumpfile --mem-usage /proc/kcore" can cause a segmentation fault on
> PPC64, because the readmem() of the following code path uses cache
> before it's initialized in initial().
>
>    show_mem_usage
>      get_page_offset
>        get_versiondep_info_ppc64
>          readmem
>      ...
>      initial
>          cache_init
>
> The get_page_offset() is needed to get vmcoreinfo from /proc/kcore data,
> so we can avoid calling it when a vmcoreinfo exists in the ELF NOTE
> segment of /proc/kcore, i.e. on Linux 4.19 and later.
>
> (Note: for older kernels, we will need another way to fix it.)
>
> Reported-by: Lichen Liu <lichliu at redhat.com>
> Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com>
> ---
>   makedumpfile.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index 5b347126db76..7d1dfcca50d8 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -12019,14 +12019,14 @@ int show_mem_usage(void)
>                 DEBUG_MSG("Read vmcoreinfo from NOTE segment: %d\n", vmcoreinfo);
>         }
>
> -       if (!get_page_offset())
> -               return FALSE;
> +       if (!vmcoreinfo) {
> +               if (!get_page_offset())
> +                       return FALSE;
>
> -       /* paddr_to_vaddr() on arm64 needs phys_base. */
> -       if (!get_phys_base())
> -               return FALSE;
> +               /* paddr_to_vaddr() on arm64 needs phys_base. */
> +               if (!get_phys_base())
> +                       return FALSE;
>
> -       if (!vmcoreinfo) {
>                 if (!get_sys_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len))
>                         return FALSE;
>
> --
> 2.31.1




More information about the kexec mailing list