On Mon, 3 Jul 2017 20:11:30 +0900
Sergey Senozhatsky <sergey.senozhatsky.w...@gmail.com> 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. And what happens if the
printk caller happens to preempt the one doing the writes to consoles?

-- Steve

> +     /*
> +      * Check if consoles are far behind the loguf head and
> +      * throttle printk() callers if so.
> +      */
> +     logbuf_lock_irqsave(flags);
> +     if (console_seq > log_first_seq)
> +             console_seen = console_seq - log_first_seq;
> +     console_to_see = log_next_seq - console_seq;
> +     logbuf_unlock_irqrestore(flags);
> +
> +     if (console_seen < 4 * console_to_see) {
> +             if (printk_delay_msec)
> +                     __printk_delay(printk_delay_msec);
> +             else
> +                     __printk_delay(PRINTK_FLOOD_DEFAULT_DELAY);
>       }
>  }
>  

Reply via email to