x86/mce: Mark mce_panic() noinstr
authorBorislav Petkov <bp@suse.de>
Mon, 1 Nov 2021 12:39:35 +0000 (13:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jan 2022 10:04:39 +0000 (11:04 +0100)
[ Upstream commit 3c7ce80a818fa7950be123cac80cd078e5ac1013 ]

And allow instrumentation inside it because it does calls to other
facilities which will not be tagged noinstr.

Fixes

  vmlinux.o: warning: objtool: do_machine_check()+0xc73: call to mce_panic() leaves .noinstr.text section

Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20211208111343.8130-8-bp@alien8.de
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/x86/kernel/cpu/mce/core.c

index c8d121085c8f7b193588ce0b6f055493441f2219..c5a1022463bcc24dd8dcf47305366cad1dfa5a6d 100644 (file)
@@ -295,11 +295,17 @@ static void wait_for_panic(void)
        panic("Panicing machine check CPU died");
 }
 
-static void mce_panic(const char *msg, struct mce *final, char *exp)
+static noinstr void mce_panic(const char *msg, struct mce *final, char *exp)
 {
-       int apei_err = 0;
        struct llist_node *pending;
        struct mce_evt_llist *l;
+       int apei_err = 0;
+
+       /*
+        * Allow instrumentation around external facilities usage. Not that it
+        * matters a whole lot since the machine is going to panic anyway.
+        */
+       instrumentation_begin();
 
        if (!fake_panic) {
                /*
@@ -314,7 +320,7 @@ static void mce_panic(const char *msg, struct mce *final, char *exp)
        } else {
                /* Don't log too much for fake panic */
                if (atomic_inc_return(&mce_fake_panicked) > 1)
-                       return;
+                       goto out;
        }
        pending = mce_gen_pool_prepare_records();
        /* First print corrected ones that are still unlogged */
@@ -352,6 +358,9 @@ static void mce_panic(const char *msg, struct mce *final, char *exp)
                panic(msg);
        } else
                pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg);
+
+out:
+       instrumentation_end();
 }
 
 /* Support code for software error injection */