Blame SOURCES/0026-ppc64-still-allow-to-move-on-if-the-emergency-stacks.patch

acf3ec
From edbd19bb260f7a98bc9e0b49fe2f0b8214885797 Mon Sep 17 00:00:00 2001
acf3ec
From: Lianbo Jiang <lijiang@redhat.com>
acf3ec
Date: Tue, 4 Oct 2022 18:57:11 +0800
acf3ec
Subject: [PATCH 26/28] ppc64: still allow to move on if the emergency stacks
acf3ec
 info fails to initialize
acf3ec
acf3ec
Currently crash will fail and then exit, if the initialization of
acf3ec
the emergency stacks information fails. In real customer environments,
acf3ec
sometimes, a vmcore may be partially damaged, although such vmcores
acf3ec
are rare. For example:
acf3ec
acf3ec
  # ./crash ../3.10.0-1127.18.2.el7.ppc64le/vmcore ../3.10.0-1127.18.2.el7.ppc64le/vmlinux  -s
acf3ec
  crash: invalid kernel virtual address: 38  type: "paca->emergency_sp"
acf3ec
  #
acf3ec
acf3ec
Lets try to keep loading vmcore if such issues happen, so call
acf3ec
the readmem() with the RETURN_ON_ERROR instead of FAULT_ON_ERROR,
acf3ec
which allows the crash move on.
acf3ec
acf3ec
Reported-by: Dave Wysochanski <dwysocha@redhat.com>
acf3ec
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
acf3ec
---
acf3ec
 ppc64.c | 18 +++++++++---------
acf3ec
 1 file changed, 9 insertions(+), 9 deletions(-)
acf3ec
acf3ec
diff --git a/ppc64.c b/ppc64.c
acf3ec
index 4ea1f7c0c6f8..b95a621d8fe4 100644
acf3ec
--- a/ppc64.c
acf3ec
+++ b/ppc64.c
acf3ec
@@ -1224,13 +1224,13 @@ ppc64_init_paca_info(void)
acf3ec
 		ulong paca_loc;
acf3ec
 
acf3ec
 		readmem(symbol_value("paca_ptrs"), KVADDR, &paca_loc, sizeof(void *),
acf3ec
-			"paca double pointer", FAULT_ON_ERROR);
acf3ec
+			"paca double pointer", RETURN_ON_ERROR);
acf3ec
 		readmem(paca_loc, KVADDR, paca_ptr, sizeof(void *) * kt->cpus,
acf3ec
-			"paca pointers", FAULT_ON_ERROR);
acf3ec
+			"paca pointers", RETURN_ON_ERROR);
acf3ec
 	} else if (symbol_exists("paca") &&
acf3ec
 		   (get_symbol_type("paca", NULL, NULL) == TYPE_CODE_PTR)) {
acf3ec
 		readmem(symbol_value("paca"), KVADDR, paca_ptr, sizeof(void *) * kt->cpus,
acf3ec
-			"paca pointers", FAULT_ON_ERROR);
acf3ec
+			"paca pointers", RETURN_ON_ERROR);
acf3ec
 	} else {
acf3ec
 		free(paca_ptr);
acf3ec
 		return;
acf3ec
@@ -1245,7 +1245,7 @@ ppc64_init_paca_info(void)
acf3ec
 		for (i = 0; i < kt->cpus; i++)
acf3ec
 			readmem(paca_ptr[i] + offset, KVADDR, &ms->emergency_sp[i],
acf3ec
 				sizeof(void *), "paca->emergency_sp",
acf3ec
-				FAULT_ON_ERROR);
acf3ec
+				RETURN_ON_ERROR);
acf3ec
 	}
acf3ec
 
acf3ec
 	if (MEMBER_EXISTS("paca_struct", "nmi_emergency_sp")) {
acf3ec
@@ -1256,7 +1256,7 @@ ppc64_init_paca_info(void)
acf3ec
 		for (i = 0; i < kt->cpus; i++)
acf3ec
 			readmem(paca_ptr[i] + offset, KVADDR, &ms->nmi_emergency_sp[i],
acf3ec
 				sizeof(void *), "paca->nmi_emergency_sp",
acf3ec
-				FAULT_ON_ERROR);
acf3ec
+				RETURN_ON_ERROR);
acf3ec
 	}
acf3ec
 
acf3ec
 	if (MEMBER_EXISTS("paca_struct", "mc_emergency_sp")) {
acf3ec
@@ -1267,7 +1267,7 @@ ppc64_init_paca_info(void)
acf3ec
 		for (i = 0; i < kt->cpus; i++)
acf3ec
 			readmem(paca_ptr[i] + offset, KVADDR, &ms->mc_emergency_sp[i],
acf3ec
 				sizeof(void *), "paca->mc_emergency_sp",
acf3ec
-				FAULT_ON_ERROR);
acf3ec
+				RETURN_ON_ERROR);
acf3ec
 	}
acf3ec
 
acf3ec
 	free(paca_ptr);
acf3ec
@@ -1947,7 +1947,7 @@ ppc64_in_emergency_stack(int cpu, ulong addr, bool verbose)
acf3ec
 	if (cpu < 0  || cpu >= kt->cpus)
acf3ec
 		return NONE_STACK;
acf3ec
 
acf3ec
-	if (ms->emergency_sp) {
acf3ec
+	if (ms->emergency_sp && IS_KVADDR(ms->emergency_sp[cpu])) {
acf3ec
 		top = ms->emergency_sp[cpu];
acf3ec
 		base =  top - STACKSIZE();
acf3ec
 		if (addr >= base && addr < top) {
acf3ec
@@ -1957,7 +1957,7 @@ ppc64_in_emergency_stack(int cpu, ulong addr, bool verbose)
acf3ec
 		}
acf3ec
 	}
acf3ec
 
acf3ec
-	if (ms->nmi_emergency_sp) {
acf3ec
+	if (ms->nmi_emergency_sp && IS_KVADDR(ms->nmi_emergency_sp[cpu])) {
acf3ec
 		top = ms->nmi_emergency_sp[cpu];
acf3ec
 		base = top - STACKSIZE();
acf3ec
 		if (addr >= base && addr < top) {
acf3ec
@@ -1967,7 +1967,7 @@ ppc64_in_emergency_stack(int cpu, ulong addr, bool verbose)
acf3ec
 		}
acf3ec
 	}
acf3ec
 
acf3ec
-	if (ms->mc_emergency_sp) {
acf3ec
+	if (ms->mc_emergency_sp && IS_KVADDR(ms->mc_emergency_sp[cpu])) {
acf3ec
 		top = ms->mc_emergency_sp[cpu];
acf3ec
 		base =  top - STACKSIZE();
acf3ec
 		if (addr >= base && addr < top) {
acf3ec
-- 
acf3ec
2.37.1
acf3ec