[RFC][PATCHv4 0/7] printk: introduce printing kernel threads

From: Sergey Senozhatsky
Date: Fri Jun 02 2017 - 05:04:38 EST


Hello,

RFC

This patch set adds a printk() SMP kernel threads which let us
to print kernel messages to the console from a non-atomic/schedule-able
context, avoiding different sort of lockups, stalls, etc.

A completely reworked version, for more details please
see 0003 commit message and code comments/documentation.

I've managed to reproduce some of the issues with a single printk
kthread solution that Jan Kara talked about. Sometimes scheduler decides
sometimes scheduler decides that printk kthread should run on the same CPU
as the process that is doing printing, so printk kthread never takes over
and systems eventually lockups. With SMP threads we can wake up printk
kthread on a remote CPU (and we know that it will be woken up on a remote
CPU), so per my tests SMP thread-ed version of printing offloading works
much better. But more tests are needed.

The patch set is in RFC stage. I think I'll move the whole
offloading thing under CONFIG_PRINTK_OFFLOAD (e.g.) at some point.

As a side note, seems that with the SMP threaded implementation
we can do (there are some constraints (!!), of course) some sort of less
deadlock prone printk. Instead of calling into the scheduler, console_sem,
console_unlock(), we can wake_up printk_kthread on a foreign CPU. So we will
not take scheduler locks or console locks from this CPU. (very-very
schematically):

int vprintk_emit(....)
{
logbuf_lock_irqsave(flags);

[..]
printed_len += log_output(facility, level, lflags, dict, dictlen, text, text_len);

set_bit(PRINTK_PENDING_OUTPUT, &printk_pending);

for_each_cpu_and(cpu, cpu_online_mask, &printk_cpumask) {
if (cpu != smp_processor_id())
wake_up_process(per_cpu(printk_kthread, cpu));
}

logbuf_unlock_irqrestore(flags);
return printed_len;
}

but, well, there are constraints and limitations.



v3->v4 (Petr, Jan)
-- use SMP kthreads. so every CPU has printk kthread now
-- add syscore notifiers
-- fix 0001 compilation warnings
-- use proper CPU notifiers return values

v2->v3 (Petr, Pavel, Andreas):
-- rework offloading
-- use PM notifiers
-- dropped some patches, etc. etc.

v1->v2:
-- introduce printk_emergency mode and API to switch it on/off
-- move printk_pending out of per-CPU memory
-- add printk emergency_mode sysfs node
-- switch sysrq handlers (some of them) to printk_emergency
-- cleanus/etc.


Sergey Senozhatsky (7):
printk: move printk_pending out of per-cpu
printk: introduce printing kernel SMP threads
printk: add enforce_emergency parameter
printk: enable printk offloading
printk: register PM notifier
printk: register syscore notifier
printk: add printk cpumask sysctl

include/linux/console.h | 3 +
include/linux/printk.h | 4 +
kernel/printk/printk.c | 385 +++++++++++++++++++++++++++++++++++++++++++++---
kernel/sysctl.c | 7 +
4 files changed, 379 insertions(+), 20 deletions(-)

--
2.13.0