[Skiboot] [PATCH 1/2] eSEL: Make sure PANIC logs are sent to BMC before calling assert

Vasant Hegde hegdevasant at linux.vnet.ibm.com
Wed Mar 4 19:58:06 AEDT 2020

eSEL logs are split into multiple smaller chunks and sent to BMC.
We use ipmi_queue_msg_sync() interface for sending OPAL_ERROR_PANIC
severity events to BMC. But callback handler (ipmi_cmd_done()) clears
'sync_msg' after getting response to first chunk as its not aware that
we have more data to send.

So in assert()/checkstop path we may endup checkstoping system before
error log is sent to BMC completely. We will miss useful error log.

This patch introduces new wait loop in ipmi_elog_commit(). It will wait
until error log is sent to BMC. I think this is safe because even if
something goes wrong (like BMC reset) we will hit timeout and eventually
we will come out of this loop.

Alternatively we can add additional check in ipmi_cmd_done() path. But
I don't wanted to make this path aware of message type.

Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
 hw/ipmi/ipmi-sel.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c
index 29dcebc59..bfce043fc 100644
--- a/hw/ipmi/ipmi-sel.c
+++ b/hw/ipmi/ipmi-sel.c
@@ -18,6 +18,7 @@
 #include <opal-msg.h>
 #include <debug_descriptor.h>
 #include <occ.h>
+#include <timebase.h>
 /* OEM SEL fields */
 #define SEL_OEM_ID_0		0x55
@@ -434,10 +435,22 @@ int ipmi_elog_commit(struct errorlog *elog_buf)
 	msg->error = ipmi_elog_error;
 	msg->req_size = 0;
-	if (elog_buf->event_severity == OPAL_ERROR_PANIC)
+	if (elog_buf->event_severity == OPAL_ERROR_PANIC) {
-	else
+		/*
+		 * eSEL logs are split into multiple smaller chunks and sent
+		 * to BMC. Lets wait until we finish sending all the chunks
+		 * to BMC.
+		 */
+		while (ipmi_sel_panic_msg.busy != false) {
+			if (msg->backend->poll)
+				msg->backend->poll();
+			time_wait_ms(10);
+		}
+	} else {
+	}
 	return 0;

More information about the Skiboot mailing list