• Dave Jones's avatar
    x86/apic: Fix suspicious RCU usage in smp_trace_call_function_interrupt() · 1eeb3225
    Dave Jones authored
    commit 7834c103 upstream.
    
    Since 4.4, I've been able to trigger this occasionally:
    
    ===============================
    [ INFO: suspicious RCU usage. ]
    4.5.0-rc7-think+ #3 Not tainted
    Cc: Andi Kleen <ak@linux.intel.com>
    Link: http://lkml.kernel.org/r/20160315012054.GA17765@codemonkey.org.ukSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    
    -------------------------------
    ./arch/x86/include/asm/msr-trace.h:47 suspicious rcu_dereference_check() usage!
    
    other info that might help us debug this:
    
    RCU used illegally from idle CPU!
    rcu_scheduler_active = 1, debug_locks = 1
    RCU used illegally from extended quiescent state!
    no locks held by swapper/3/0.
    
    stack backtrace:
    CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.5.0-rc7-think+ #3
     ffffffff92f821e0 1f3e5c340597d7fc ffff880468e07f10 ffffffff92560c2a
     ffff880462145280 0000000000000001 ffff880468e07f40 ffffffff921376a6
     ffffffff93665ea0 0000cc7c876d28da 0000000000000005 ffffffff9383dd60
    Call Trace:
     <IRQ>  [<ffffffff92560c2a>] dump_stack+0x67/0x9d
     [<ffffffff921376a6>] lockdep_rcu_suspicious+0xe6/0x100
     [<ffffffff925ae7a7>] do_trace_write_msr+0x127/0x1a0
     [<ffffffff92061c83>] native_apic_msr_eoi_write+0x23/0x30
     [<ffffffff92054408>] smp_trace_call_function_interrupt+0x38/0x360
     [<ffffffff92d1ca60>] trace_call_function_interrupt+0x90/0xa0
     <EOI>  [<ffffffff92ac5124>] ? cpuidle_enter_state+0x1b4/0x520
    
    Move the entering_irq() call before ack_APIC_irq(), because entering_irq()
    tells the RCU susbstems to end the extended quiescent state, so that the
    following trace call in ack_APIC_irq() works correctly.
    Suggested-by: default avatarAndi Kleen <ak@linux.intel.com>
    Fixes: 4787c368 "x86/tracing: Add irq_enter/exit() in smp_trace_reschedule_interrupt()"
    Signed-off-by: default avatarDave Jones <davej@codemonkey.org.uk>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    1eeb3225
apic.h 15.6 KB