Commit 9026cc82 authored by Borislav Petkov's avatar Borislav Petkov Committed by Ingo Molnar
Browse files

x86/ras, EDAC, acpi: Assign MCE notifier handlers a priority



Assign all notifiers on the MCE decode chain a priority so that they get
called in the correct order.

Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Yazen Ghannam <Yazen.Ghannam@amd.com>
Cc: linux-edac <linux-edac@vger.kernel.org>
Link: http://lkml.kernel.org/r/20170123183514.13356-10-bp@alien8.de


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent cff4c039
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -189,6 +189,15 @@ extern struct mce_vendor_flags mce_flags;

extern struct mca_config mca_cfg;
extern struct mca_msr_regs msr_ops;

enum mce_notifier_prios {
	MCE_PRIO_SRAO		= INT_MAX,
	MCE_PRIO_EXTLOG		= INT_MAX - 1,
	MCE_PRIO_NFIT		= INT_MAX - 2,
	MCE_PRIO_EDAC		= INT_MAX - 3,
	MCE_PRIO_LOWEST		= 0,
};

extern void mce_register_decode_chain(struct notifier_block *nb);
extern void mce_unregister_decode_chain(struct notifier_block *nb);

+3 −5
Original line number Diff line number Diff line
@@ -216,9 +216,7 @@ void mce_register_decode_chain(struct notifier_block *nb)
{
	atomic_inc(&num_notifiers);

	/* Ensure SRAO notifier has the highest priority in the decode chain. */
	if (nb != &mce_srao_nb && nb->priority == INT_MAX)
		nb->priority -= 1;
	WARN_ON(nb->priority > MCE_PRIO_LOWEST && nb->priority < MCE_PRIO_EDAC);

	atomic_notifier_chain_register(&x86_mce_decoder_chain, nb);
}
@@ -582,7 +580,7 @@ static int srao_decode_notifier(struct notifier_block *nb, unsigned long val,
}
static struct notifier_block mce_srao_nb = {
	.notifier_call	= srao_decode_notifier,
	.priority = INT_MAX,
	.priority	= MCE_PRIO_SRAO,
};

static int mce_default_notifier(struct notifier_block *nb, unsigned long val,
@@ -608,7 +606,7 @@ static int mce_default_notifier(struct notifier_block *nb, unsigned long val,
static struct notifier_block mce_default_nb = {
	.notifier_call	= mce_default_notifier,
	/* lowest prio, we want it to run last. */
	.priority	= 0,
	.priority	= MCE_PRIO_LOWEST,
};

/*
+1 −0
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@ static bool __init extlog_get_l1addr(void)
}
static struct notifier_block extlog_mce_dec = {
	.notifier_call	= extlog_print,
	.priority	= MCE_PRIO_EXTLOG,
};

static int __init extlog_init(void)
+1 −0
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ static int nfit_handle_mce(struct notifier_block *nb, unsigned long val,

static struct notifier_block nfit_mce_dec = {
	.notifier_call	= nfit_handle_mce,
	.priority	= MCE_PRIO_NFIT,
};

void nfit_mce_register(void)
+1 −0
Original line number Diff line number Diff line
@@ -1835,6 +1835,7 @@ static int i7core_mce_check_error(struct notifier_block *nb, unsigned long val,

static struct notifier_block i7_mce_dec = {
	.notifier_call	= i7core_mce_check_error,
	.priority	= MCE_PRIO_EDAC,
};

struct memdev_dmi_entry {
Loading