On Wed, May 20, 2020 at 09:24:46PM +0200, Thomas Gleixner wrote:
> Andy Lutomirski <[email protected]> writes:
> > On Wed, May 20, 2020 at 8:36 AM Andy Lutomirski <[email protected]> wrote:
> >     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?
> 
> Just chatted with Paul on IRC and he thinks this should work, but he's
> not sure whether it's actually sane :)

I will have more to say after coding it up.  ;-)

                                                        Thanx, Paul

Reply via email to