*/
 int __read_mostly suppress_printk;
 
+/*
+ * During panic, heavy printk by other CPUs can delay the
+ * panic and risk deadlock on console resources.
+ */
+int __read_mostly suppress_panic_printk;
+
 #ifdef CONFIG_LOCKDEP
 static struct lockdep_map console_lock_dep_map = {
        .name = "console_lock"
        if (unlikely(suppress_printk))
                return 0;
 
+       if (unlikely(suppress_panic_printk) &&
+           atomic_read(&panic_cpu) != raw_smp_processor_id())
+               return 0;
+
        if (level == LOGLEVEL_SCHED) {
                level = LOGLEVEL_DEFAULT;
                in_sched = true;
 {
        static char ext_text[CONSOLE_EXT_LOG_MAX];
        static char text[CONSOLE_LOG_MAX];
+       static int panic_console_dropped;
        unsigned long flags;
        bool do_cond_resched, retry;
        struct printk_info info;
                if (console_seq != r.info->seq) {
                        console_dropped += r.info->seq - console_seq;
                        console_seq = r.info->seq;
+                       if (panic_in_progress() && panic_console_dropped++ > 10) {
+                               suppress_panic_printk = 1;
+                               pr_warn_once("Too many dropped messages. Suppress messages on non-panic CPUs to prevent livelock.\n");
+                       }
                }
 
                if (suppress_message_printing(r.info->level)) {