61 lines
1.8 KiB
Diff
61 lines
1.8 KiB
Diff
|
|
From 53241d7be35fba23079504468090d770d4116831 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Artem Senichev <a.senichev@yadro.com>
|
||
|
|
Date: Tue, 28 Jul 2020 17:38:17 +0300
|
||
|
|
Subject: [PATCH] Stop and send SRESET for one thread only
|
||
|
|
|
||
|
|
Fixes bugs preventing the host from creating a crash dump.
|
||
|
|
|
||
|
|
Stopping all threads leads to errors in skiboot:
|
||
|
|
[ 163.237293219,3] Could not stop thread 0:0:1: Thread is quiesced already.
|
||
|
|
If the kernel has xmon support, exiting the debugger causes the kernel
|
||
|
|
to hang:
|
||
|
|
[ 235.694220] watchdog: CPU 97 TB:187362511366, last heartbeat TB:159120095297 (55160ms ago)
|
||
|
|
[ 235.694276] watchdog: CPU 101 Hard LOCKUP
|
||
|
|
|
||
|
|
Sending SRESET to all threads causes kernel panic:
|
||
|
|
[ 50.495727] Kernel panic - not syncing: Unrecoverable nested System Reset
|
||
|
|
|
||
|
|
Signed-off-by: Artem Senichev <a.senichev@yadro.com>
|
||
|
|
---
|
||
|
|
nmi_interface.cpp | 14 +++++++++++---
|
||
|
|
1 file changed, 11 insertions(+), 3 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/nmi_interface.cpp b/nmi_interface.cpp
|
||
|
|
index fcce451..d022d7e 100644
|
||
|
|
--- a/nmi_interface.cpp
|
||
|
|
+++ b/nmi_interface.cpp
|
||
|
|
@@ -38,7 +38,7 @@ void NMI::nMI()
|
||
|
|
using InternalFailure =
|
||
|
|
sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
|
||
|
|
|
||
|
|
- struct pdbg_target* target;
|
||
|
|
+ struct pdbg_target* target = nullptr;
|
||
|
|
|
||
|
|
pdbg_for_each_class_target("thread", target)
|
||
|
|
{
|
||
|
|
@@ -51,11 +51,19 @@ void NMI::nMI()
|
||
|
|
report<InternalFailure>();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
+ break;
|
||
|
|
}
|
||
|
|
|
||
|
|
- if (thread_sreset_all() < 0)
|
||
|
|
+ if (!target)
|
||
|
|
{
|
||
|
|
- log<level::ERR>("Failed to sreset all threads");
|
||
|
|
+ log<level::ERR>("Thread not found");
|
||
|
|
+ report<InternalFailure>();
|
||
|
|
+ return;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (thread_sreset(target) < 0)
|
||
|
|
+ {
|
||
|
|
+ log<level::ERR>("Failed to sreset thread");
|
||
|
|
report<InternalFailure>();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|