On (07/03/17 15:34), Steven Rostedt wrote: > > +#define PRINTK_FLOOD_DEFAULT_DELAY 10 > > + > > int printk_delay_msec __read_mostly; > > > > +static inline void __printk_delay(int m) > > +{ > > + while (m--) { > > + mdelay(1); > > + touch_nmi_watchdog(); > > + } > > +} > > + > > static inline void printk_delay(void) > > { > > - if (unlikely(printk_delay_msec)) { > > - int m = printk_delay_msec; > > + unsigned long flags; > > + u64 console_seen = 0, console_to_see; > > > > - while (m--) { > > - mdelay(1); > > - touch_nmi_watchdog(); > > - } > > + if (printk_delay_msec) { > > + __printk_delay(printk_delay_msec); > > + return; > > + } > > + > > This had better be an option, and not default.
yes. > And what happens if the printk caller happens to preempt the one > doing the writes to consoles? in short - we just burn CPU cycles. that case is broken. that's mostly the reason behind PRINTK_FLOOD_DEFAULT_DELAY being quite small. one can simply do console_lock(); printk(); printk(); .... printk(); console_unlock(); and trigger a useless throttling. a needed one in general case, but useless in the given circumstances. not sure if we can properly throttle printk in all of the cases. we know that console_sem is locked, but we don't know what for. is CPU that owns the console_sem is now in console_unlock() or somewhere in fbcon, or anywhere else. we probably need not to throttle printk() if we know that console_sem is already locked by this_cpu and we simply call printk either from IRQ that preempted console_unlock() on this_cpu or recursive printk from console_unlock()... and so on. -ss