On (02/12/19 15:29), John Ogness wrote: [..] > + /* the printk kthread never exits */ > + for (;;) { > + ret = prb_iter_wait_next(&iter, buf, > + PRINTK_RECORD_MAX, &master_seq); > + if (ret == -ERESTARTSYS) { > + continue; > + } else if (ret < 0) { > + /* iterator invalid, start over */ > + prb_iter_init(&iter, &printk_rb, NULL); > + continue; > + } > + > + msg = (struct printk_log *)buf; > + format_text(msg, master_seq, ext_text, &ext_len, text, > + &len, printk_time); > + > + console_lock(); > + if (len > 0 || ext_len > 0) { > + call_console_drivers(ext_text, ext_len, text, len); > + boot_delay_msec(msg->level); > + printk_delay(); > + } > + console_unlock(); > + } This, theoretically, creates a whole new world of possibilities for console drivers. Now they can do GFP_KERNEL allocations and stall printk_kthread during OOM; or they can explicitly reschedule from ->write() callback (via console_conditional_schedule()) because console_lock() sets console_may_schedule. It's one thing to do cond_resched() (or to let preemption to take over) after call_console_drivers() (when we are done printing a message to all console drivers) and another thing to let preemption to take over while we are printing a messages to the consoles. It probably would make sense to disable preemption around call_console_drivers(). -ss