Hi Dave,
The firmware assisted dump (fadump) patches are still under discussion. When
fadump patches gets into upstream kernel, this change will need to go into
crash. For now, I am posting this patch for a review.
Reference:
http://lists.ozlabs.org/pipermail/linuxppc-dev/2011-December/094859.html
Thanks,
-Mahesh.
From: Mahesh Salgaonkar <mahesh(a)linux.vnet.ibm.com>
With the firmware-assisted dump (fadump) support added for Powerpc the
crash tool also needs to be modified to be able to read compressed/filtered
firmware-assisted dump (diskdump). The crash tool is able to read and
identify the panic task for ELF formatted dump generated by firmware
assisted dump mechanism. But when fadump is filtered/compressed using
makdumpfile the crash tool fails to identify panic task and back trace
associated to panic task. This patch enables crash tool to identify the
panic task for dump generated by firmware-assisted dump on Power platform.
Signed-off-by: Mahesh Salgaonkar <mahesh(a)linux.vnet.ibm.com>
---
ppc64.c | 1 +
task.c | 21 ++++++++++++++++++++-
2 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/ppc64.c b/ppc64.c
index eee7359..196c417 100755
--- a/ppc64.c
+++ b/ppc64.c
@@ -1907,6 +1907,7 @@ retry:
STREQ(sym, ".netpoll_start_netdump") ||
STREQ(sym, ".start_disk_dump") ||
STREQ(sym, ".crash_kexec") ||
+ STREQ(sym, ".crash_fadump") ||
STREQ(sym, ".disk_dump")) {
*nip = *up;
*ksp = bt->stackbase +
diff --git a/task.c b/task.c
index 1ce48ea..ec1984e 100755
--- a/task.c
+++ b/task.c
@@ -6443,6 +6443,13 @@ clear_active_set(void)
crash_kexec_task); \
return crash_kexec_task; \
} \
+ if (crash_fadump_task) { \
+ if (CRASHDEBUG(1)) \
+ error(INFO, \
+ "get_active_set_panic_task: %lx (crash_fadump)\n", \
+ crash_fadump_task); \
+ return crash_fadump_task; \
+ } \
if ((panic_task > (NO_TASK+1)) && !die_task) { \
if (CRASHDEBUG(1)) \
fprintf(fp, \
@@ -6508,6 +6515,10 @@ clear_active_set(void)
strstr(buf, " .crash_kexec+")) { \
crash_kexec_task = task; \
} \
+ if (strstr(buf, " crash_fadump+") || \
+ strstr(buf, " .crash_fadump+")) { \
+ crash_fadump_task = task; \
+ } \
if (strstr(buf, " machine_kexec+") || \
strstr(buf, " .machine_kexec+")) { \
crash_kexec_task = task; \
@@ -6531,12 +6542,13 @@ get_active_set_panic_task()
int i, j, found;
ulong task;
char buf[BUFSIZE];
- ulong panic_task, die_task, crash_kexec_task;
+ ulong panic_task, die_task, crash_kexec_task, crash_fadump_task;
ulong xen_panic_task;
ulong xen_sysrq_task;
panic_task = die_task = crash_kexec_task = xen_panic_task = NO_TASK;
xen_sysrq_task = NO_TASK;
+ crash_fadump_task = NO_TASK;
for (i = 0; i < NR_CPUS; i++) {
if (!(task = tt->active_set[i]) || !task_exists(task))
@@ -6616,6 +6628,13 @@ get_active_set_panic_task()
crash_kexec_task);
return crash_kexec_task;
}
+ if (crash_fadump_task) {
+ if (CRASHDEBUG(1))
+ error(INFO,
+ "get_active_set_panic_task: %lx (crash_fadump)\n",
+ crash_fadump_task);
+ return crash_fadump_task;
+ }
if (xen_sysrq_task) {
if (CRASHDEBUG(1))