|
@@ -199,55 +199,15 @@ void mce_log(struct mce *mce)
|
|
|
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;
|
|
|
|
|
|
-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. */
|
|
|
if (nb != &mce_srao_nb && nb->priority == INT_MAX)
|
|
|
nb->priority -= 1;
|
|
|
|
|
|
atomic_notifier_chain_register(&x86_mce_decoder_chain, nb);
|
|
|
-
|
|
|
- if (drain)
|
|
|
- drain_mcelog_buffer();
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(mce_register_decode_chain);
|
|
|
|
|
@@ -2028,7 +1988,7 @@ __setup("mce", mcheck_enable);
|
|
|
int __init mcheck_init(void)
|
|
|
{
|
|
|
mcheck_intel_therm_init();
|
|
|
- mce_register_decode_chain(&mce_srao_nb, false);
|
|
|
+ mce_register_decode_chain(&mce_srao_nb);
|
|
|
mcheck_vendor_init_severity();
|
|
|
|
|
|
INIT_WORK(&mce_work, mce_process_work);
|