Andy Lutomirski <l...@kernel.org> writes: > So maybe the code can change to: > > if (user_mode(regs)) { > enter_from_user_mode(); > } else { > if (!__rcu_is_watching()) { > /* > * If RCU is not watching then the same careful > * sequence vs. lockdep and tracing is required. > * > * This only happens for IRQs that hit the idle loop, and > * even that only happens if we aren't using the sane > * MWAIT-while-IF=0 mode. > */ > lockdep_hardirqs_off(CALLER_ADDR0); > rcu_irq_enter(); > instrumentation_begin(); > trace_hardirqs_off_prepare(); > instrumentation_end(); > return true; > } else { > /* > * If RCU is watching then the combo function > * can be used. > */ > instrumentation_begin(); > trace_hardirqs_off(); > rcu_tickle(); > instrumentation_end(); > } > } > return false; > > This is exactly what you have except that the cond_rcu part is gone > and I added rcu_tickle(). > > Paul, the major change here is that if an IRQ hits normal kernel code > (i.e. code where RCU is watching and we're not in an EQS), the IRQ > won't call rcu_irq_enter() and rcu_irq_exit(). Instead it will call > rcu_tickle() on entry and nothing on exit. Does that cover all the > bases?
Fine with me, but the final vote needs to come from Paul and Joel. Thanks, tglx