Skip to content

Commit c1caae3

Browse files
Hari Bathinimpe
authored andcommitted
powerpc/kdump: Ignore failure in enabling big endian exception during crash
In LE kernel, we currently have a hack for kexec that resets the exception endian before starting a new kernel as the kernel that is loaded could be a big endian or a little endian kernel. In kdump case, resetting exception endian fails when one or more cpus is disabled. But we can ignore the failure and still go ahead, as in most cases crashkernel will be of same endianess as primary kernel and reseting endianess is not even needed in those cases. This patch adds a new inline function to say if this is kdump path. This function is used at places where such a check is needed. Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com> [mpe: Rename to kdump_in_progress(), use bool, and edit comment] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
1 parent 1e5d0fd commit c1caae3

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

arch/powerpc/include/asm/kexec.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ extern int overlaps_crashkernel(unsigned long start, unsigned long size);
8686
extern void reserve_crashkernel(void);
8787
extern void machine_kexec_mask_interrupts(void);
8888

89+
static inline bool kdump_in_progress(void)
90+
{
91+
return crashing_cpu >= 0;
92+
}
93+
8994
#else /* !CONFIG_KEXEC */
9095
static inline void crash_kexec_secondary(struct pt_regs *regs) { }
9196

@@ -106,6 +111,11 @@ static inline int crash_shutdown_unregister(crash_shutdown_t handler)
106111
return 0;
107112
}
108113

114+
static inline bool kdump_in_progress(void)
115+
{
116+
return false;
117+
}
118+
109119
#endif /* CONFIG_KEXEC */
110120
#endif /* ! __ASSEMBLY__ */
111121
#endif /* __KERNEL__ */

arch/powerpc/kernel/machine_kexec_64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ void default_machine_kexec(struct kimage *image)
330330
* using debugger IPI.
331331
*/
332332

333-
if (crashing_cpu == -1)
333+
if (!kdump_in_progress())
334334
kexec_prepare_cpus();
335335

336336
pr_debug("kexec: Starting switchover sequence.\n");

arch/powerpc/platforms/pseries/lpar.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include <asm/trace.h>
4444
#include <asm/firmware.h>
4545
#include <asm/plpar_wrappers.h>
46+
#include <asm/kexec.h>
4647
#include <asm/fadump.h>
4748

4849
#include "pseries.h"
@@ -267,8 +268,13 @@ static void pSeries_lpar_hptab_clear(void)
267268
* out to the user, but at least this will stop us from
268269
* continuing on further and creating an even more
269270
* difficult to debug situation.
271+
*
272+
* There is a known problem when kdump'ing, if cpus are offline
273+
* the above call will fail. Rather than panicking again, keep
274+
* going and hope the kdump kernel is also little endian, which
275+
* it usually is.
270276
*/
271-
if (rc)
277+
if (rc && !kdump_in_progress())
272278
panic("Could not enable big endian exceptions");
273279
}
274280
#endif

0 commit comments

Comments
 (0)