|
@@ -144,23 +144,20 @@ static struct mce_log mcelog = {
|
|
|
void mce_log(struct mce *mce)
|
|
|
{
|
|
|
unsigned next, entry;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
/* Emit the trace record: */
|
|
|
trace_mce_record(mce);
|
|
|
|
|
|
+ ret = atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, mce);
|
|
|
+ if (ret == NOTIFY_STOP)
|
|
|
+ return;
|
|
|
+
|
|
|
mce->finished = 0;
|
|
|
wmb();
|
|
|
for (;;) {
|
|
|
entry = rcu_dereference_check_mce(mcelog.next);
|
|
|
for (;;) {
|
|
|
- /*
|
|
|
- * If edac_mce is enabled, it will check the error type
|
|
|
- * and will process it, if it is a known error.
|
|
|
- * Otherwise, the error will be sent through mcelog
|
|
|
- * interface
|
|
|
- */
|
|
|
- if (edac_mce_parse(mce))
|
|
|
- return;
|
|
|
|
|
|
/*
|
|
|
* When the buffer fills up discard new entries.
|
|
@@ -551,10 +548,8 @@ void machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
|
|
|
* Don't get the IP here because it's unlikely to
|
|
|
* have anything to do with the actual error location.
|
|
|
*/
|
|
|
- if (!(flags & MCP_DONTLOG) && !mce_dont_log_ce) {
|
|
|
+ if (!(flags & MCP_DONTLOG) && !mce_dont_log_ce)
|
|
|
mce_log(&m);
|
|
|
- atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, &m);
|
|
|
- }
|
|
|
|
|
|
/*
|
|
|
* Clear state for this bank.
|