x86/mce: Fix mce=nobootlog
authorJan H. Schönherr <jschoenh@amazon.de>
Fri, 3 Jan 2020 15:07:18 +0000 (16:07 +0100)
committerBorislav Petkov <bp@suse.de>
Mon, 13 Jan 2020 09:07:56 +0000 (10:07 +0100)
Since commit

  8b38937b7ab5 ("x86/mce: Do not enter deferred errors into the generic
 pool twice")

the mce=nobootlog option has become mostly ineffective (after being only
slightly ineffective before), as the code is taking actions on MCEs left
over from boot when they have a usable address.

Move the check for MCP_DONTLOG a bit outward to make it effective again.

Also, since commit

  011d82611172 ("RAS: Add a Corrected Errors Collector")

the two branches of the remaining "if" at the bottom of machine_check_poll()
do same. Unify them.

Signed-off-by: Jan H. Schönherr <jschoenh@amazon.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20200103150722.20313-3-jschoenh@amazon.de
arch/x86/kernel/cpu/mce/core.c

index d061753..81b97a6 100644 (file)
@@ -755,26 +755,22 @@ bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
 log_it:
                error_seen = true;
 
-               mce_read_aux(&m, i);
+               if (flags & MCP_DONTLOG)
+                       goto clear_it;
 
+               mce_read_aux(&m, i);
                m.severity = mce_severity(&m, mca_cfg.tolerant, NULL, false);
-
                /*
                 * Don't get the IP here because it's unlikely to
                 * have anything to do with the actual error location.
                 */
-               if (!(flags & MCP_DONTLOG) && !mca_cfg.dont_log_ce)
-                       mce_log(&m);
-               else if (mce_usable_address(&m)) {
-                       /*
-                        * Although we skipped logging this, we still want
-                        * to take action. Add to the pool so the registered
-                        * notifiers will see it.
-                        */
-                       if (!mce_gen_pool_add(&m))
-                               mce_schedule_work();
-               }
 
+               if (mca_cfg.dont_log_ce && !mce_usable_address(&m))
+                       goto clear_it;
+
+               mce_log(&m);
+
+clear_it:
                /*
                 * Clear state for this bank.
                 */