[Crash-utility] Re: [PATCH] vmcoreinfo: read vmcoreinfo using 'vmcoreinfo_data' when unavailable in elf note

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch LGTM, so ack.

Thanks,
Tao Liu

On Thu, Oct 10, 2024 at 12:08 AM Aditya Gupta <adityag@xxxxxxxxxxxxx> wrote:
>
> Few vmcores don't have vmcoreinfo elf note, such as those created using
> virsh-dump.
>
> On architectures such as PowerPC64, vmcoreinfo is mandatory to fetch the
> first_vmalloc_address, for vmcores of upstream linux, since crash-utility commit:
>
>     commit 5b24e363a898 ("get vmalloc start address from vmcoreinfo")
>
> Try reading from the 'vmcoreinfo_data' symbol instead, if the vmcoreinfo
> crash tries to read in case of diskdump/netdump is empty/missing.
>
> The approach to read 'vmcoreinfo_data' was used for a live kernel, which can be
> reused in the case of missing vmcoreinfo note also, as the
> 'vmcoreinfo_data' symbol is available with vmcore too
>
> Hence rename 'vmcoreinfo_read_string' in kernel.c to
> 'vmcoreinfo_read_from_memory', and use it in netdump.c and diskdump.c
> too.
>
> Reported-by: Anushree Mathur <anushree.mathur@xxxxxxxxxxxxx>
> Tested-by: Anushree Mathur <anushree.mathur@xxxxxxxxxxxxx>
> Signed-off-by: Aditya Gupta <adityag@xxxxxxxxxxxxx>
> ---
>  defs.h     |  1 +
>  diskdump.c | 18 ++++++++++++++++++
>  kernel.c   |  9 ++++-----
>  netdump.c  | 19 +++++++++++++++++++
>  4 files changed, 42 insertions(+), 5 deletions(-)
>
> diff --git a/defs.h b/defs.h
> index 2231cb68b804..910264e12314 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -6166,6 +6166,7 @@ void dump_kernel_table(int);
>  void dump_bt_info(struct bt_info *, char *where);
>  void dump_log(int);
>  void parse_kernel_version(char *);
> +char *vmcoreinfo_read_from_memory(const char *);
>
>  #define LOG_LEVEL(v) ((v) & 0x07)
>  #define SHOW_LOG_LEVEL    (0x1)
> diff --git a/diskdump.c b/diskdump.c
> index ce3cbb7b12dd..30d0c87f84c1 100644
> --- a/diskdump.c
> +++ b/diskdump.c
> @@ -1041,6 +1041,13 @@ pfn_to_pos(ulong pfn)
>         return desc_pos;
>  }
>
> +/**
> + * Check if vmcoreinfo in vmcore is missing/empty
> + */
> +static bool is_vmcoreinfo_empty(void)
> +{
> +       return (dd->sub_header_kdump->size_vmcoreinfo == 0);
> +}
>
>  /*
>   *  Determine whether a file is a diskdump creation, and if TRUE,
> @@ -1088,6 +1095,17 @@ is_diskdump(char *file)
>
>         pc->read_vmcoreinfo = vmcoreinfo_read_string;
>
> +       /*
> +        * vmcoreinfo can be empty in case of dump collected via virsh-dump
> +        *
> +        * check if vmcoreinfo is not available in vmcore, and try to read
> +        * thev vmcore from memory, using "vmcoreinfo_data" symbol
> +        */
> +       if (is_vmcoreinfo_empty()) {
> +               error(WARNING, "vmcoreinfo is empty, will read from symbols\n");
> +               pc->read_vmcoreinfo = vmcoreinfo_read_from_memory;
> +       }
> +
>         if ((pc->flags2 & GET_LOG) && KDUMP_CMPRS_VALID()) {
>                 pc->dfd = dd->dfd;
>                 pc->readmem = read_diskdump;
> diff --git a/kernel.c b/kernel.c
> index adb19ad8725d..7d26a5c5a0a1 100644
> --- a/kernel.c
> +++ b/kernel.c
> @@ -99,7 +99,6 @@ static ulong dump_audit_skb_queue(ulong);
>  static ulong __dump_audit(char *);
>  static void dump_audit(void);
>  static void dump_printk_safe_seq_buf(int);
> -static char *vmcoreinfo_read_string(const char *);
>  static void check_vmcoreinfo(void);
>  static int is_pvops_xen(void);
>  static int get_linux_banner_from_vmlinux(char *, size_t);
> @@ -11852,8 +11851,8 @@ dump_printk_safe_seq_buf(int msg_flags)
>   * Returns a string (that has to be freed by the caller) that contains the
>   * value for key or NULL if the key has not been found.
>   */
> -static char *
> -vmcoreinfo_read_string(const char *key)
> +char *
> +vmcoreinfo_read_from_memory(const char *key)
>  {
>         char *buf, *value_string, *p1, *p2;
>         size_t value_length;
> @@ -11918,10 +11917,10 @@ check_vmcoreinfo(void)
>                 switch (get_symbol_type("vmcoreinfo_data", NULL, NULL))
>                 {
>                 case TYPE_CODE_PTR:
> -                       pc->read_vmcoreinfo = vmcoreinfo_read_string;
> +                       pc->read_vmcoreinfo = vmcoreinfo_read_from_memory;
>                         break;
>                 case TYPE_CODE_ARRAY:
> -                       pc->read_vmcoreinfo = vmcoreinfo_read_string;
> +                       pc->read_vmcoreinfo = vmcoreinfo_read_from_memory;
>                         break;
>                 }
>         }
> diff --git a/netdump.c b/netdump.c
> index b4e2a5cb2037..c69c7a1e80db 100644
> --- a/netdump.c
> +++ b/netdump.c
> @@ -111,6 +111,14 @@ map_cpus_to_prstatus(void)
>         FREEBUF(nt_ptr);
>  }
>
> +/**
> + * Check if vmcoreinfo in vmcore is missing/empty
> + */
> +static bool is_vmcoreinfo_empty(void)
> +{
> +       return (nd->size_vmcoreinfo == 0);
> +}
> +
>  /*
>   *  Determine whether a file is a netdump/diskdump/kdump creation,
>   *  and if TRUE, initialize the vmcore_data structure.
> @@ -464,6 +472,17 @@ is_netdump(char *file, ulong source_query)
>
>         pc->read_vmcoreinfo = vmcoreinfo_read_string;
>
> +       /*
> +        * vmcoreinfo can be empty in case of dump collected via virsh-dump
> +        *
> +        * check if vmcoreinfo is not available in vmcore, and try to read
> +        * thev vmcore from memory, using "vmcoreinfo_data" symbol
> +        */
> +       if (is_vmcoreinfo_empty()) {
> +               error(WARNING, "vmcoreinfo is empty, will read from symbols\n");
> +               pc->read_vmcoreinfo = vmcoreinfo_read_from_memory;
> +       }
> +
>         if ((source_query == KDUMP_LOCAL) &&
>             (pc->flags2 & GET_OSRELEASE))
>                 kdump_get_osrelease();
> --
> 2.46.2
>
--
Crash-utility mailing list -- devel@xxxxxxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxxxxxxxxxxxx
https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux