• John Stultz's avatar
    timekeeping: use printk_deferred when holding timekeeping seqlock · 6d9bcb62
    John Stultz authored
    Jiri Bohac pointed out that there are rare but potential deadlock
    possibilities when calling printk while holding the timekeeping
    seqlock.
    
    This is due to printk() triggering console sem wakeup, which can
    cause scheduling code to trigger hrtimers which may try to read
    the time.
    
    Specifically, as Jiri pointed out, that path is:
      printk
        vprintk_emit
          console_unlock
            up(&console_sem)
              __up
    	    wake_up_process
    	      try_to_wake_up
    	        ttwu_do_activate
    		  ttwu_activate
    		    activate_task
    		      enqueue_task
    		        enqueue_task_fair
    			  hrtick_update
    			    hrtick_start_fair
    			      hrtick_start_fair
    			        get_time
    				  ktime_get
    				    --> endless loop on
    				    read_seqcount_retry(&timekeeper_seq, ...)
    
    This patch tries to avoid this issue by using printk_deferred (previously
    named printk_sched) which should defer printing via a irq_work_queue.
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    Reported-by: default avatarJiri Bohac <jbohac@suse.cz>
    Reviewed-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6d9bcb62
timekeeping.c 45.3 KB