• Thomas Gleixner's avatar
    x86/tsc: Defer marking TSC unstable to a worker · bd94d86f
    Thomas Gleixner authored
    Tetsuo reported the following lockdep splat when the TSC synchronization
    fails during CPU hotplug:
    
       tsc: Marking TSC unstable due to check_tsc_sync_source failed
      
       WARNING: inconsistent lock state
       inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
       ffffffff8cfa1c78 (watchdog_lock){?.-.}-{2:2}, at: clocksource_watchdog+0x23/0x5a0
       {IN-HARDIRQ-W} state was registered at:
         _raw_spin_lock_irqsave+0x3f/0x60
         clocksource_mark_unstable+0x1b/0x90
         mark_tsc_unstable+0x41/0x50
         check_tsc_sync_source+0x14f/0x180
         sysvec_call_function_single+0x69/0x90
    
       Possible unsafe locking scenario:
         lock(watchdog_lock);
         <Interrupt>
           lock(watchdog_lock);
    
       stack backtrace:
        _raw_spin_lock+0x30/0x40
        clocksource_watchdog+0x23/0x5a0
        run_timer_softirq+0x2a/0x50
        sysvec_apic_timer_interrupt+0x6e/0x90
    
    The reason is the recent conversion of the TSC synchronization function
    during CPU hotplug on the control CPU to a SMP function call. In case
    that the synchronization with the upcoming CPU fails, the TSC has to be
    marked unstable via clocksource_mark_unstable().
    
    clocksource_mark_unstable() acquires 'watchdog_lock', but that lock is
    taken with interrupts enabled in the watchdog timer callback to minimize
    interrupt disabled time. That's obviously a possible deadlock scenario,
    
    Before that change the synchronization function was invoked in thread
    context so this could not happen.
    
    As it is not crucical whether the unstable marking happens slightly
    delayed, defer the call to a worker thread which avoids the lock context
    problem.
    
    Fixes: 9d349d47 ("x86/smpboot: Make TSC synchronization function call based")
    Reported-by: default avatarTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/87zg064ceg.ffs@tglx
    bd94d86f
tsc_sync.c 14.3 KB