Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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: default avatarTony Luck <tony.luck@intel.com>
Signed-off-by: default avatarBorislav 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: default avatarIngo Molnar <mingo@kernel.org>
parent f29a7aff
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -140,7 +140,7 @@ struct mce_vendor_flags {
extern struct mce_vendor_flags mce_flags;

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);

#include <linux/percpu.h>
+2 −42
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -286,7 +286,7 @@ static int __init extlog_init(void)
	 */
	old_edac_report_status = get_edac_report_status();
	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 */
	((struct extlog_l1_head *)extlog_l1_addr)->flags |= FLAG_OS_OPTIN;

+1 −1
Original line number Diff line number Diff line
@@ -2424,7 +2424,7 @@ static int __init i7core_init(void)
	pci_rc = pci_register_driver(&i7core_driver);

	if (pci_rc >= 0) {
		mce_register_decode_chain(&i7_mce_dec, true);
		mce_register_decode_chain(&i7_mce_dec);
		return 0;
	}

+1 −1
Original line number Diff line number Diff line
@@ -895,7 +895,7 @@ static int __init mce_amd_init(void)

	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;
}
Loading