• Jiri Slaby's avatar
    x86/timer: Make delay() work during early bootup · 4c45c516
    Jiri Slaby authored
    When a panic happens during bootup, "Rebooting in X seconds.." is
    shown, but reboot happens immediatelly. It is because panic() uses mdelay()
    and mdelay() calls __const_udelay() immediately, which does not
    work while booting.
    
    The per_cpu cpu_info.loops_per_jiffy value is not initialized yet, so
    __const_udelay() actually multiplies the number of loops by zero. This
    results in __const_udelay() to delay the execution only by a nanosecond
    or so.
    
    So check whether cpu_info.loops_per_jiffy is zero and use
    loops_per_jiffy in that case. mdelay() will not be so precise without
    proper calibration, but it works relatively well.
    
    Before:
    
      [    0.170039] delaying 100ms
      [    0.170828] done
    
    After
    
      [    0.214042] delaying 100ms
      [    0.313974] done
    
    I do not think the added check matters given we are about to spin the
    processor in the next few hundred cycles.
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
    Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20170119114730.2670-1-jslaby@suse.cz
    [ Minor edits. ]
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    4c45c516
delay.c 3.79 KB