Thread (30 messages) flat view 30 messages, 5 authors, 2017-02-15

[PATCH V8 06/10] acpi: apei: panic OS with fatal error status block

From: james.morse@arm.com (James Morse)
Date: 2017-02-15 12:13:22
Also in: kvm, kvmarm, linux-acpi, linux-efi, lkml

Hi Tyler,

On 13/02/17 22:45, Baicar, Tyler wrote:
On 2/9/2017 3:48 AM, James Morse wrote:
quoted
On 01/02/17 17:16, Tyler Baicar wrote:
quoted
From: "Jonathan (Zhixiong) Zhang" <redacted>

Even if an error status block's severity is fatal, the kernel does not
honor the severity level and panic.

With the firmware first model, the platform could inform the OS about a
fatal hardware error through the non-NMI GHES notification type. The OS
should panic when a hardware error record is received with this
severity.

Call panic() after CPER data in error status block is printed if
severity is fatal, before each error section is handled.
quoted
quoted
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index 8756172..86c1f15 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -687,6 +689,13 @@ static int ghes_ack_error(struct acpi_hest_generic_v2
*generic_v2)
      return rc;
  }
  +static void __ghes_call_panic(void)
+{
+    if (panic_timeout == 0)
+        panic_timeout = ghes_panic_timeout;
+    panic("Fatal hardware error!");
+}
+
quoted
__ghes_panic() also has:
quoted
    __ghes_print_estatus(KERN_EMERG, ghes->generic, ghes->estatus);
Which prints this estatus regardless of rate limiting and cache-ing.
[...]
quoted
quoted
              ghes_estatus_cache_add(ghes->generic, ghes->estatus);
      }
+    if (ghes_severity(ghes->estatus->error_severity) >= GHES_SEV_PANIC) {
+        __ghes_call_panic();
+    }
quoted
I think this ghes_severity() then panic() should go above the:
quoted
    if (!ghes_estatus_cached(ghes->estatus)) {
and we should call __ghes_print_estatus() here too, to make sure the message
definitely got out!
Okay, that makes sense. If we move this up, is there a problem with calling
__ghes_panic() instead of making the __ghes_print_estatus() and
__ghes_call_panic() calls here? It looks like that will just add a call to
oops_begin() and ghes_print_queued_estatus() as well, but this is what
ghes_notify_nmi() does if the severity is panic.

I don't think the queued stuff is relevant, isn't that just for x86-NMI messages
that it doesn't print out directly?

A quick grep shows arm64 doesn't have oops_begin(), you may have to add some
equivalent mechanism. Lets try and avoid that rabbit hole!

Given __ghes_panic() calls __ghes_print_estatus() too, you could try moving that
into your new __ghes_call_panic().... or whatever results in the least lines
changed!


Thanks,

James
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help