lkml.org 
[lkml]   [2019]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC tip/core/rcu 09/14] rcu/nocb: Don't wake no-CBs GP kthread if timer posted under overload
    Date
    When under overload conditions, __call_rcu_nocb_wake() will wake the
    no-CBs GP kthread any time the no-CBs CB kthread is asleep or there
    are no ready-to-invoke callbacks, but only after a timer delay. If the
    no-CBs GP kthread has a ->nocb_bypass_timer pending, the deferred wakeup
    from __call_rcu_nocb_wake() is redundant. This commit therefore makes
    __call_rcu_nocb_wake() avoid posting the redundant deferred wakeup if
    ->nocb_bypass_timer is pending. This requires adding a bit of ordering
    of timer actions.

    Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
    ---
    kernel/rcu/tree_plugin.h | 7 +++++--
    1 file changed, 5 insertions(+), 2 deletions(-)

    diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
    index efd7f6fa2790..379cb7e50a62 100644
    --- a/kernel/rcu/tree_plugin.h
    +++ b/kernel/rcu/tree_plugin.h
    @@ -1906,8 +1906,10 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone,
    rcu_advance_cbs_nowake(rdp->mynode, rdp);
    rdp->nocb_gp_adv_time = j;
    }
    - if (rdp->nocb_cb_sleep ||
    - !rcu_segcblist_ready_cbs(&rdp->cblist))
    + smp_mb(); /* Enqueue before timer_pending(). */
    + if ((rdp->nocb_cb_sleep ||
    + !rcu_segcblist_ready_cbs(&rdp->cblist)) &&
    + !timer_pending(&rdp->nocb_bypass_timer))
    wake_nocb_gp_defer(rdp, RCU_NOCB_WAKE_FORCE,
    TPS("WakeOvfIsDeferred"));
    rcu_nocb_unlock_irqrestore(rdp, flags);
    @@ -1926,6 +1928,7 @@ static void do_nocb_bypass_wakeup_timer(struct timer_list *t)

    trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("Timer"));
    rcu_nocb_lock_irqsave(rdp, flags);
    + smp_mb__after_spinlock(); /* Timer expire before wakeup. */
    __call_rcu_nocb_wake(rdp, true, flags);
    }

    --
    2.17.1
    \
     
     \ /
      Last update: 2019-08-02 17:17    [W:4.219 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site