x86/MCE: Add an MCE-record filtering function
authorYazen Ghannam <yazen.ghannam@amd.com>
Mon, 25 Mar 2019 16:34:22 +0000 (16:34 +0000)
committerBorislav Petkov <bp@suse.de>
Tue, 23 Apr 2019 16:04:47 +0000 (18:04 +0200)
Some systems may report spurious MCA errors. In general, spurious MCA
errors may be disabled by clearing a particular bit in MCA_CTL. However,
clearing a bit in MCA_CTL may not be recommended for some errors, so the
only option is to ignore them.

An MCA error is printed and handled after it has been added to the MCE
event pool. So an MCA error can be ignored by not adding it to that pool
in the first place.

Add such a filtering function.

 [ bp: Move function prototype to the internal header and massage. ]

Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "clemej@gmail.com" <clemej@gmail.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Pu Wen <puwen@hygon.cn>
Cc: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
Cc: "rafal@milecki.pl" <rafal@milecki.pl>
Cc: Shirish S <Shirish.S@amd.com>
Cc: <stable@vger.kernel.org> # 5.0.x
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: x86-ml <x86@kernel.org>
Link: https://lkml.kernel.org/r/20190325163410.171021-1-Yazen.Ghannam@amd.com
arch/x86/kernel/cpu/mce/core.c
arch/x86/kernel/cpu/mce/genpool.c
arch/x86/kernel/cpu/mce/internal.h

index 3e081428117c5f94313322eda1beb1c13b8794e5..80b8c6bff8edab686b612b7c058925ce847c837e 100644 (file)
@@ -1775,6 +1775,11 @@ static void __mcheck_cpu_init_timer(void)
        mce_start_timer(t);
 }
 
+bool filter_mce(struct mce *m)
+{
+       return false;
+}
+
 /* Handle unconfigured int18 (should never happen) */
 static void unexpected_machine_check(struct pt_regs *regs, long error_code)
 {
index 3395549c51d3f74502c18060ac5160ad934a1b48..64d1d5a00f397acae1ba23d8d97efe96f86a9d0c 100644 (file)
@@ -99,6 +99,9 @@ int mce_gen_pool_add(struct mce *mce)
 {
        struct mce_evt_llist *node;
 
+       if (filter_mce(mce))
+               return -EINVAL;
+
        if (!mce_evt_pool)
                return -EINVAL;
 
index af5eab1e65e2707416ecab9e179c3255ec1320a3..b822a645395d9e025d0a94d3ad2fee192b1f3101 100644 (file)
@@ -173,4 +173,7 @@ struct mca_msr_regs {
 
 extern struct mca_msr_regs msr_ops;
 
+/* Decide whether to add MCE record to MCE event pool or filter it out. */
+extern bool filter_mce(struct mce *m);
+
 #endif /* __X86_MCE_INTERNAL_H__ */