Skip to content

Commit

Permalink
x86/ras, EDAC, acpi: Assign MCE notifier handlers a priority
Browse files Browse the repository at this point in the history
Assign all notifiers on the MCE decode chain a priority so that they get
called in the correct order.

Suggested-by: Thomas Gleixner <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: Yazen Ghannam <[email protected]>
Cc: linux-edac <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
suryasaimadhu authored and Ingo Molnar committed Jan 24, 2017
1 parent cff4c03 commit 9026cc8
Show file tree
Hide file tree
Showing 8 changed files with 20 additions and 7 deletions.
9 changes: 9 additions & 0 deletions arch/x86/include/asm/mce.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
8 changes: 3 additions & 5 deletions arch/x86/kernel/cpu/mcheck/mce.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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,
Expand All @@ -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,
};

/*
Expand Down
1 change: 1 addition & 0 deletions drivers/acpi/acpi_extlog.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions drivers/acpi/nfit/mce.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions drivers/edac/i7core_edac.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions drivers/edac/mce_amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1054,6 +1054,7 @@ amd_decode_mce(struct notifier_block *nb, unsigned long val, void *data)

static struct notifier_block amd_mce_dec_nb = {
.notifier_call = amd_decode_mce,
.priority = MCE_PRIO_EDAC,
};

static int __init mce_amd_init(void)
Expand Down
3 changes: 2 additions & 1 deletion drivers/edac/sb_edac.c
Original file line number Diff line number Diff line change
Expand Up @@ -3136,7 +3136,8 @@ static int sbridge_mce_check_error(struct notifier_block *nb, unsigned long val,
}

static struct notifier_block sbridge_mce_dec = {
.notifier_call = sbridge_mce_check_error,
.notifier_call = sbridge_mce_check_error,
.priority = MCE_PRIO_EDAC,
};

/****************************************************************************
Expand Down
3 changes: 2 additions & 1 deletion drivers/edac/skx_edac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,7 +1007,8 @@ static int skx_mce_check_error(struct notifier_block *nb, unsigned long val,
}

static struct notifier_block skx_mce_dec = {
.notifier_call = skx_mce_check_error,
.notifier_call = skx_mce_check_error,
.priority = MCE_PRIO_EDAC,
};

static void skx_remove(void)
Expand Down

0 comments on commit 9026cc8

Please sign in to comment.