return this_cpu_read(printk_func)(fmt, args);
 }
 
+extern atomic_t nmi_message_lost;
+static inline int get_nmi_message_lost(void)
+{
+       return atomic_xchg(&nmi_message_lost, 0);
+}
+
 #else /* CONFIG_PRINTK_NMI */
 
 static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args)
        return vprintk_default(fmt, args);
 }
 
+static inline int get_nmi_message_lost(void)
+{
+       return 0;
+}
+
 #endif /* CONFIG_PRINTK_NMI */
 
  */
 DEFINE_PER_CPU(printk_func_t, printk_func) = vprintk_default;
 static int printk_nmi_irq_ready;
+atomic_t nmi_message_lost;
 
 #define NMI_LOG_BUF_LEN (4096 - sizeof(atomic_t) - sizeof(struct irq_work))
 
 again:
        len = atomic_read(&s->len);
 
-       if (len >= sizeof(s->buffer))
+       if (len >= sizeof(s->buffer)) {
+               atomic_inc(&nmi_message_lost);
                return 0;
+       }
 
        /*
         * Make sure that all old data have been read before the buffer was
 
        unsigned long flags;
        int this_cpu;
        int printed_len = 0;
+       int nmi_message_lost;
        bool in_sched = false;
        /* cpu currently holding logbuf_lock in this function */
        static unsigned int logbuf_cpu = UINT_MAX;
                                         strlen(recursion_msg));
        }
 
+       nmi_message_lost = get_nmi_message_lost();
+       if (unlikely(nmi_message_lost)) {
+               text_len = scnprintf(textbuf, sizeof(textbuf),
+                                    "BAD LUCK: lost %d message(s) from NMI context!",
+                                    nmi_message_lost);
+               printed_len += log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
+                                        NULL, 0, textbuf, text_len);
+       }
+
        /*
         * The printf needs to come first; we need the syslog
         * prefix which might be passed-in as a parameter.