[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20201102063803.17438-1-xuqiang36@huawei.com>
Date: Mon, 2 Nov 2020 06:38:03 +0000
From: Xu Qiang <xuqiang36@...wei.com>
To: <sfr@...b.auug.org.au>, <akpm@...ux-foundation.org>,
<koct9i@...il.com>, <xuqiang36@...wei.com>,
<linux-kernel@...r.kernel.org>
CC: <rui.xiang@...wei.com>
Subject: [PATCH -next] kernel/watchdog_hld.c: Complete the flush of the hard deadlock log messages to the serial port
when hardlockup_all_cpu_backtrace is on, and there are
a large number of cores in the system, it takes
a long time to output the hard deadlock logs of all cores
to the serial port. When the console_flush_on_panic function
in panic is executed, console_locked is still held.
As a result, garbled characters are displayed in the serial port log.
To solve this problem, wait for a maximum of 10s for the serial port
to be released before entering the panic mode.
Signed-off-by: Xu Qiang <xuqiang36@...wei.com>
---
kernel/watchdog_hld.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/kernel/watchdog_hld.c b/kernel/watchdog_hld.c
index a546bc54f6ff..d3410b9fd3c3 100644
--- a/kernel/watchdog_hld.c
+++ b/kernel/watchdog_hld.c
@@ -13,8 +13,10 @@
#define pr_fmt(fmt) "NMI watchdog: " fmt
#include <linux/nmi.h>
+#include <linux/delay.h>
#include <linux/atomic.h>
#include <linux/module.h>
+#include <linux/console.h>
#include <linux/sched/debug.h>
#include <asm/irq_regs.h>
@@ -129,6 +131,7 @@ static void watchdog_overflow_callback(struct perf_event *event,
* then this is a good indication the cpu is stuck
*/
if (is_hardlockup()) {
+ int i;
int this_cpu = smp_processor_id();
/* only print hardlockups once */
@@ -151,9 +154,15 @@ static void watchdog_overflow_callback(struct perf_event *event,
if (sysctl_hardlockup_all_cpu_backtrace &&
!test_and_set_bit(0, &hardlockup_allcpu_dumped))
trigger_allbutself_cpu_backtrace();
-
- if (hardlockup_panic)
+ if (hardlockup_panic) {
+ /* Wait for all CPUs to complete wake_up_klogd_work_func */
+ for (i = 0; i < 10 * 1000; i++) {
+ if (console_trylock())
+ break;
+ mdelay(1);
+ }
nmi_panic(regs, "Hard LOCKUP");
+ }
atomic_inc(&hardlockup_detected);
__this_cpu_write(hard_watchdog_warn, true);
--
2.25.0
Powered by blists - more mailing lists