On Thu 10-12-15 23:52:51, Sergey Senozhatsky wrote: > Hello, > > *** in this email and in every later emails *** > Sorry, if I messed up with Cc list or message-ids. It's suprisingly > hard to jump in into a loop that has never been in your inbox. It took > some `googling' effort. > > I haven't tested the patch set yet, I just 'ported' it to linux-next. > I reverted 073696a8bc7779b ("printk: do cond_resched() between lines while > outputting to consoles") as a first step, but it comes in later again. I can > send out the updated series (off list is OK). > > > Currently, console_unlock() prints messages from kernel printk buffer to > > console while the buffer is non-empty. When serial console is attached, > > printing is slow and thus other CPUs in the system have plenty of time > > to append new messages to the buffer while one CPU is printing. Thus the > > CPU can spend unbounded amount of time doing printing in console_unlock(). > > This is especially serious problem if the printk() calling > > console_unlock() was called with interrupts disabled. > > > > In practice users have observed a CPU can spend tens of seconds printing > > in console_unlock() (usually during boot when hundreds of SCSI devices > > are discovered) resulting in RCU stalls (CPU doing printing doesn't > > reach quiescent state for a long time), softlockup reports (IPIs for the > > printing CPU don't get served and thus other CPUs are spinning waiting > > for the printing CPU to process IPIs), and eventually a machine death > > (as messages from stalls and lockups append to printk buffer faster than > > we are able to print). So these machines are unable to boot with serial > > console attached. Also during artificial stress testing SATA disk > > disappears from the system because its interrupts aren't served for too > > long. > > > > This patch implements a mechanism where after printing specified number > > of characters (tunable as a kernel parameter printk.offload_chars), CPU > > doing printing asks for help by waking up one of dedicated kthreads. As > > soon as the printing CPU notices kthread got scheduled and is spinning > > on print_lock dedicated for that purpose, it drops console_sem, > > print_lock, and exits console_unlock(). Kthread then takes over printing > > instead. This way no CPU should spend printing too long even if there > > is heavy printk traffic. > > > > Signed-off-by: Jan Kara > > I think we better use raw_spin_lock as a print_lock; and, apart from that, > seems that we don't re-init in zap_lock(). So I ended up with the following > patch on top of yours (to be folded): > > - use raw_spin_lock > - do not forget to re-init `print_lock' in zap_locks() Thanks for looking into my patches and sorry for replying with a delay. As I wrote in my previous email [1] even the referenced patches are not quite enough. Over last few days I have worked on redoing the stuff as we discussed with Linus and Andrew at Kernel Summit and I have new patches which are working fine for me. I still want to test them on some machines having real issues with udev during boot but so far stress-testing with serial console slowed down to ~1000 chars/sec on other machines and VMs looks promising. I'm attaching them in case you want to have a look. They are on top of Tejun's patch adding cond_resched() (which is essential). I'll officially submit the patches once the testing is finished (but I'm not sure when I get to the problematic HW...). Honza [1] http://www.spinics.net/lists/stable/msg111535.html -- Jan Kara SUSE Labs, CR