diff options
author | Borislav Petkov <bp@suse.de> | 2021-11-01 13:39:35 +0100 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2021-12-13 14:13:01 +0100 |
commit | 3c7ce80a818fa7950be123cac80cd078e5ac1013 (patch) | |
tree | 78605a0e8a91550d38046ac4354b980d0aa950d4 | |
parent | 0a5b288e85bbef5227bb6397e31fcf1d7ba9142a (diff) | |
download | linux-3c7ce80a818fa7950be123cac80cd078e5ac1013.tar.gz linux-3c7ce80a818fa7950be123cac80cd078e5ac1013.tar.bz2 linux-3c7ce80a818fa7950be123cac80cd078e5ac1013.zip |
x86/mce: Mark mce_panic() noinstr
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
-rw-r--r-- | arch/x86/kernel/cpu/mce/core.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c index d788ccc5a35f..ec0f7bb53477 100644 --- a/arch/x86/kernel/cpu/mce/core.c +++ b/arch/x86/kernel/cpu/mce/core.c @@ -266,11 +266,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) { /* @@ -285,7 +291,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 */ @@ -321,6 +327,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 */ |