Re: [RFC][PATCH v3 1/2] printk: Make printk() completely async

From: Jan Kara
Date: Mon Mar 14 2016 - 03:11:01 EST


On Sun 13-03-16 22:34:46, Sergey Senozhatsky wrote:
> + /*
> + * By default we print message to console asynchronously so that kernel
> + * doesn't get stalled due to slow serial console. That can lead to
> + * softlockups, lost interrupts, or userspace timing out under heavy
> + * printing load.
> + *
> + * However we resort to synchronous printing of messages during early
> + * boot, when synchronous printing was explicitly requested by
> + * kernel parameter, or when console_verbose() was called to print
> + * everything during panic / oops.
> + */
> + if (!sync_print) {
> + if (printk_thread && !in_panic) {
> + /*
> + * Wakeup the printing kthread and offload printing
> + * to a schedulable context.
> + */
> + wake_up(&printing_wait);
> + } else if (in_sched) {
> + /*
> + * @in_sched messages may come too early, when we don't
> + * yet have @printk_thread. We can't print deferred
> + * messages directly, because this may deadlock, route
> + * them via IRQ context.
> + */
> + __this_cpu_or(printk_pending,
> + PRINTK_PENDING_OUTPUT);
> + irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));

You cannot call wake_up() from a scheduler context - i.e., if in_sched is
true, you have to use irq work unconditionally. You can wake up kthread
from irq work or just directly print the message there. Otherwise the patch
looks fine.

Honza
--
Jan Kara <jack@xxxxxxxx>
SUSE Labs, CR