On Wed, 20 Jun 2018 17:47:19 +0900 Byungchul Park <byungchul.p...@lge.com> wrote:
> Get rid of dependency on ->dynticks_nmi_nesting. This is not a trivial change. Can you please explain the rational and background in the change log. Add enough context here to know why this change is needed. Thanks! -- Steve > > Signed-off-by: Byungchul Park <byungchul.p...@lge.com> > --- > kernel/rcu/tree.c | 22 ++++++++++------------ > 1 file changed, 10 insertions(+), 12 deletions(-) > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index deb2508..59ae94e 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -797,6 +797,11 @@ void rcu_nmi_exit(void) > return; > } > > + if (!in_nmi()) { > + rcu_prepare_for_idle(); > + rcu_dynticks_task_enter(); > + } > + > /* This NMI interrupted an RCU-idle CPU, restore RCU-idleness. */ > trace_rcu_dyntick(TPS("Startirq"), rdtp->dynticks_nmi_nesting, 0, > rdtp->dynticks); > WRITE_ONCE(rdtp->dynticks_nmi_nesting, 0); /* Avoid store tearing. */ > @@ -824,14 +829,8 @@ void rcu_nmi_exit(void) > */ > void rcu_irq_exit(void) > { > - struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks); > - > lockdep_assert_irqs_disabled(); > - if (rdtp->dynticks_nmi_nesting == 1) > - rcu_prepare_for_idle(); > rcu_nmi_exit(); > - if (rdtp->dynticks_nmi_nesting == 0) > - rcu_dynticks_task_enter(); > } > > /* > @@ -944,6 +943,11 @@ void rcu_nmi_enter(void) > if (rcu_dynticks_curr_cpu_in_eqs()) { > rcu_dynticks_eqs_exit(); > incby = 1; > + > + if (!in_nmi()) { > + rcu_dynticks_task_exit(); > + rcu_cleanup_after_idle(); > + } > } > trace_rcu_dyntick(incby == 1 ? TPS("Endirq") : TPS("++="), > rdtp->dynticks_nmi_nesting, > @@ -977,14 +981,8 @@ void rcu_nmi_enter(void) > */ > void rcu_irq_enter(void) > { > - struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks); > - > lockdep_assert_irqs_disabled(); > - if (rdtp->dynticks_nmi_nesting == 0) > - rcu_dynticks_task_exit(); > rcu_nmi_enter(); > - if (rdtp->dynticks_nmi_nesting == 1) > - rcu_cleanup_after_idle(); > } > > /*