Messages in this thread | | | From | Byungchul Park <> | Date | Thu, 21 Jun 2018 00:25:44 +0900 | Subject | Re: [RFC 1/2] rcu: Do prepare and cleanup idle depending on in_nmi() |
| |
On Wed, Jun 20, 2018 at 10:33 PM, Steven Rostedt <rostedt@goodmis.org> wrote: > On Wed, 20 Jun 2018 17:47:19 +0900 > Byungchul Park <byungchul.park@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.
I'm sorry I didn't. I thought I could add enough explanation after requesting for comment and getting answer. But I should've done that :(
The 1st patch is the 1st step for removing ->dynticks_nmi_nesting entirely from the code, which is done mainly in the 2nd patch.
At the next spin(not RFC), I will add full explanation about what you point out.
Thanks a lot.
> Thanks! > > -- Steve > >> >> Signed-off-by: Byungchul Park <byungchul.park@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(); >> } >> >> /* >
-- Thanks, Byungchul
| |