lkml.org 
[lkml]   [2019]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH tip/core/rcu 01/10] rcu/nocb: Enable re-awakening under high callback load
    Date
    The __call_rcu_nocb_wake() function and its predecessors set
    ->qlen_last_fqs_check to zero for the first callback and to LONG_MAX / 2
    for forced reawakenings. The former can result in a too-quick reawakening
    when there are many callbacks ready to invoke and the latter prevents a
    second reawakening. This commit therefore sets ->qlen_last_fqs_check
    to the current number of callbacks in both cases. While in the area,
    this commit also moves both assignments under ->nocb_lock.

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

    diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
    index c1dfbac8cd39..297b38732e28 100644
    --- a/kernel/rcu/tree_plugin.h
    +++ b/kernel/rcu/tree_plugin.h
    @@ -1626,6 +1626,7 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone,
    // Need to actually to a wakeup.
    len = rcu_segcblist_n_cbs(&rdp->cblist);
    if (was_alldone) {
    + rdp->qlen_last_fqs_check = len;
    if (!irqs_disabled_flags(flags)) {
    /* ... if queue was empty ... */
    wake_nocb_gp(rdp, false, flags);
    @@ -1636,9 +1637,9 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone,
    TPS("WakeEmptyIsDeferred"));
    rcu_nocb_unlock_irqrestore(rdp, flags);
    }
    - rdp->qlen_last_fqs_check = 0;
    } else if (len > rdp->qlen_last_fqs_check + qhimark) {
    /* ... or if many callbacks queued. */
    + rdp->qlen_last_fqs_check = len;
    if (!irqs_disabled_flags(flags)) {
    wake_nocb_gp(rdp, true, flags);
    trace_rcu_nocb_wake(rcu_state.name, rdp->cpu,
    @@ -1648,7 +1649,6 @@ static void __call_rcu_nocb_wake(struct rcu_data *rdp, bool was_alldone,
    TPS("WakeOvfIsDeferred"));
    rcu_nocb_unlock_irqrestore(rdp, flags);
    }
    - rdp->qlen_last_fqs_check = LONG_MAX / 2;
    } else {
    trace_rcu_nocb_wake(rcu_state.name, rdp->cpu, TPS("WakeNot"));
    rcu_nocb_unlock_irqrestore(rdp, flags);
    --
    2.17.1
    \
     
     \ /
      Last update: 2019-08-02 01:17    [W:2.391 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site