ATOMIC_NOTIFIER_HEAD(x86_mce_decoder_chain);
 EXPORT_SYMBOL_GPL(x86_mce_decoder_chain);
 
-static int default_decode_mce(struct notifier_block *nb, unsigned long val,
-                              void *data)
-{
-       pr_emerg(HW_ERR "No human readable MCE decoding support on this CPU type.\n");
-       pr_emerg(HW_ERR "Run the message through 'mcelog --ascii' to decode.\n");
-
-       return NOTIFY_STOP;
-}
-
-static struct notifier_block mce_dec_nb = {
-       .notifier_call = default_decode_mce,
-       .priority      = -1,
-};
-
 /* MCA banks polled by the period polling timer for corrected events */
 DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = {
        [0 ... BITS_TO_LONGS(MAX_NR_BANKS)-1] = ~0UL
 
 static void print_mce(struct mce *m)
 {
+       int ret = 0;
+
        pr_emerg(HW_ERR "CPU %d: Machine Check Exception: %Lx Bank %d: %016Lx\n",
               m->extcpu, m->mcgstatus, m->bank, m->status);
 
         * Print out human-readable details about the MCE error,
         * (if the CPU has an implementation for that)
         */
-       atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, m);
+       ret = atomic_notifier_call_chain(&x86_mce_decoder_chain, 0, m);
+       if (ret == NOTIFY_STOP)
+               return;
+
+       pr_emerg_ratelimited(HW_ERR "Run the above through 'mcelog --ascii'\n");
 }
 
 #define PANIC_TIMEOUT 5 /* 5 seconds */
 
 int __init mcheck_init(void)
 {
-       atomic_notifier_chain_register(&x86_mce_decoder_chain, &mce_dec_nb);
-
        mcheck_intel_therm_init();
 
        return 0;