Commit 7636c13 ("vmcoreinfo: read vmcoreinfo using 'vmcoreinfo_data'
when unavailable in elf note") moved the vmcoreinfo reading to always
read from memory instead of relying on diskdump/netdump's local
handlers. This was later reverted to fix regression in X86_64 kslar
images.
Reintroduce the `vmcoreinfo_read_from_memory` as fallback to
diskdump/netdump vmcores.
This reverts commit 72e2776caf1ca41dffcc8aba11c55c636565725b.
Cc: Aditya Gupta <adityag(a)linux.ibm.com>
Cc: Tao Liu <ltao(a)redhat.com>
Signed-off-by: Shivang Upadhyay <shivangu(a)linux.ibm.com>
---
defs.h | 1 +
diskdump.c | 3 +++
kernel.c | 17 ++++++++++++-----
netdump.c | 2 ++
4 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/defs.h b/defs.h
index ceed3a9..e5d38c2 100644
--- a/defs.h
+++ b/defs.h
@@ -6235,6 +6235,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 0ff8782..c16e7b9 100644
--- a/diskdump.c
+++ b/diskdump.c
@@ -2434,6 +2434,9 @@ err:
if (buf)
free(buf);
+ if (value_string == NULL)
+ return vmcoreinfo_read_from_memory(key);
+
return value_string;
}
diff --git a/kernel.c b/kernel.c
index bb148d0..ec287bb 100644
--- a/kernel.c
+++ b/kernel.c
@@ -100,7 +100,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);
@@ -11960,8 +11959,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;
@@ -11971,6 +11970,14 @@ vmcoreinfo_read_string(const char *key)
buf = value_string = NULL;
+ if (!(pc->flags & GDB_INIT)) {
+ /*
+ * GDB interface hasn't been initialised yet, so can't
+ * access vmcoreinfo_data
+ */
+ return NULL;
+ }
+
switch (get_symbol_type("vmcoreinfo_data", NULL, NULL))
{
case TYPE_CODE_PTR:
@@ -12026,10 +12033,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 ba1c6c4..fd0d545 100644
--- a/netdump.c
+++ b/netdump.c
@@ -2020,6 +2020,8 @@ vmcoreinfo_read_string(const char *key)
}
}
+ if (value == NULL)
+ return vmcoreinfo_read_from_memory(key);
return value;
}
--
2.52.0