x86/mce: Kill drain_mcelog_buffer()
This used to flush out MCEs logged during early boot and which were in the MCA registers from a previous system run. No need for that now, since we've moved to a genpool. Suggested-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1439396985-12812-7-git-send-email-bp@alien8.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
f29a7aff4b
commit
eef4dfa0cb
|
@ -140,7 +140,7 @@ struct mce_vendor_flags {
|
||||||
extern struct mce_vendor_flags mce_flags;
|
extern struct mce_vendor_flags mce_flags;
|
||||||
|
|
||||||
extern struct mca_config mca_cfg;
|
extern struct mca_config mca_cfg;
|
||||||
extern void mce_register_decode_chain(struct notifier_block *nb, bool drain);
|
extern void mce_register_decode_chain(struct notifier_block *nb);
|
||||||
extern void mce_unregister_decode_chain(struct notifier_block *nb);
|
extern void mce_unregister_decode_chain(struct notifier_block *nb);
|
||||||
|
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
|
|
|
@ -199,55 +199,15 @@ void mce_log(struct mce *mce)
|
||||||
set_bit(0, &mce_need_notify);
|
set_bit(0, &mce_need_notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drain_mcelog_buffer(void)
|
|
||||||
{
|
|
||||||
unsigned int next, i, prev = 0;
|
|
||||||
|
|
||||||
next = ACCESS_ONCE(mcelog.next);
|
|
||||||
|
|
||||||
do {
|
|
||||||
struct mce *m;
|
|
||||||
|
|
||||||
/* drain what was logged during boot */
|
|
||||||
for (i = prev; i < next; i++) {
|
|
||||||
unsigned long start = jiffies;
|
|
||||||
unsigned retries = 1;
|
|
||||||
|
|
||||||
m = &mcelog.entry[i];
|
|
||||||
|
|
||||||
while (!m->finished) {
|
|
||||||
if (time_after_eq(jiffies, start + 2*retries))
|
|
||||||
retries++;
|
|
||||||
|
|
||||||
cpu_relax();
|
|
||||||
|
|
||||||
if (!m->finished && retries >= 4) {
|
|
||||||
pr_err("skipping error being logged currently!\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
smp_rmb();
|
|
||||||
atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(mcelog.entry + prev, 0, (next - prev) * sizeof(*m));
|
|
||||||
prev = next;
|
|
||||||
next = cmpxchg(&mcelog.next, prev, 0);
|
|
||||||
} while (next != prev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct notifier_block mce_srao_nb;
|
static struct notifier_block mce_srao_nb;
|
||||||
|
|
||||||
void mce_register_decode_chain(struct notifier_block *nb, bool drain)
|
void mce_register_decode_chain(struct notifier_block *nb)
|
||||||
{
|
{
|
||||||
/* Ensure SRAO notifier has the highest priority in the decode chain. */
|
/* Ensure SRAO notifier has the highest priority in the decode chain. */
|
||||||
if (nb != &mce_srao_nb && nb->priority == INT_MAX)
|
if (nb != &mce_srao_nb && nb->priority == INT_MAX)
|
||||||
nb->priority -= 1;
|
nb->priority -= 1;
|
||||||
|
|
||||||
atomic_notifier_chain_register(&x86_mce_decoder_chain, nb);
|
atomic_notifier_chain_register(&x86_mce_decoder_chain, nb);
|
||||||
|
|
||||||
if (drain)
|
|
||||||
drain_mcelog_buffer();
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mce_register_decode_chain);
|
EXPORT_SYMBOL_GPL(mce_register_decode_chain);
|
||||||
|
|
||||||
|
@ -2028,7 +1988,7 @@ __setup("mce", mcheck_enable);
|
||||||
int __init mcheck_init(void)
|
int __init mcheck_init(void)
|
||||||
{
|
{
|
||||||
mcheck_intel_therm_init();
|
mcheck_intel_therm_init();
|
||||||
mce_register_decode_chain(&mce_srao_nb, false);
|
mce_register_decode_chain(&mce_srao_nb);
|
||||||
mcheck_vendor_init_severity();
|
mcheck_vendor_init_severity();
|
||||||
|
|
||||||
INIT_WORK(&mce_work, mce_process_work);
|
INIT_WORK(&mce_work, mce_process_work);
|
||||||
|
|
|
@ -286,7 +286,7 @@ static int __init extlog_init(void)
|
||||||
*/
|
*/
|
||||||
old_edac_report_status = get_edac_report_status();
|
old_edac_report_status = get_edac_report_status();
|
||||||
set_edac_report_status(EDAC_REPORTING_DISABLED);
|
set_edac_report_status(EDAC_REPORTING_DISABLED);
|
||||||
mce_register_decode_chain(&extlog_mce_dec, true);
|
mce_register_decode_chain(&extlog_mce_dec);
|
||||||
/* enable OS to be involved to take over management from BIOS */
|
/* enable OS to be involved to take over management from BIOS */
|
||||||
((struct extlog_l1_head *)extlog_l1_addr)->flags |= FLAG_OS_OPTIN;
|
((struct extlog_l1_head *)extlog_l1_addr)->flags |= FLAG_OS_OPTIN;
|
||||||
|
|
||||||
|
|
|
@ -2424,7 +2424,7 @@ static int __init i7core_init(void)
|
||||||
pci_rc = pci_register_driver(&i7core_driver);
|
pci_rc = pci_register_driver(&i7core_driver);
|
||||||
|
|
||||||
if (pci_rc >= 0) {
|
if (pci_rc >= 0) {
|
||||||
mce_register_decode_chain(&i7_mce_dec, true);
|
mce_register_decode_chain(&i7_mce_dec);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -895,7 +895,7 @@ static int __init mce_amd_init(void)
|
||||||
|
|
||||||
pr_info("MCE: In-kernel MCE decoding enabled.\n");
|
pr_info("MCE: In-kernel MCE decoding enabled.\n");
|
||||||
|
|
||||||
mce_register_decode_chain(&amd_mce_dec_nb, true);
|
mce_register_decode_chain(&amd_mce_dec_nb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2591,7 +2591,7 @@ static int __init sbridge_init(void)
|
||||||
|
|
||||||
pci_rc = pci_register_driver(&sbridge_driver);
|
pci_rc = pci_register_driver(&sbridge_driver);
|
||||||
if (pci_rc >= 0) {
|
if (pci_rc >= 0) {
|
||||||
mce_register_decode_chain(&sbridge_mce_dec, true);
|
mce_register_decode_chain(&sbridge_mce_dec);
|
||||||
if (get_edac_report_status() == EDAC_REPORTING_DISABLED)
|
if (get_edac_report_status() == EDAC_REPORTING_DISABLED)
|
||||||
sbridge_printk(KERN_WARNING, "Loading driver, error reporting disabled.\n");
|
sbridge_printk(KERN_WARNING, "Loading driver, error reporting disabled.\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue