[Crash-utility] [PATCH] fadump: Add support for compressed firmware-assisted dump.

Mahesh J Salgaonkar mahesh at linux.vnet.ibm.com
Thu Dec 15 15:06:25 UTC 2011


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 at 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 at 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))




More information about the Crash-utility mailing list