lkml.org 
[lkml]   [2009]   [Dec]   [15]   [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/18] rcu: remove redundant grace-period check
    Date
    From: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

    Proposed for 2.6.34, not for inclusion.

    The rcu_process_dyntick() function checks twice for the end of
    the current grace period. However, it holds the current rcu_node
    structure's ->lock field throughout, and doesn't get to the second call
    to rcu_gp_in_progress() unless there is at least one CPU corresponding
    to this rcu_node structure that has not yet checked in for the current
    grace period, which would prevent the current grace period from ending.
    So the current grace period cannot have ended, and the second check is
    redundant, so remove it.

    Also, given that this function is used even with !CONFIG_NO_HZ, its name
    is quite misleading. Change from rcu_process_dyntick() to force_qs_rnp().

    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    kernel/rcutree.c | 9 ++++-----
    1 files changed, 4 insertions(+), 5 deletions(-)

    diff --git a/kernel/rcutree.c b/kernel/rcutree.c
    index 6268f37..d920285 100644
    --- a/kernel/rcutree.c
    +++ b/kernel/rcutree.c
    @@ -1146,8 +1146,7 @@ void rcu_check_callbacks(int cpu, int user)
    * have not yet encountered a quiescent state, using the function specified.
    * The caller must have suppressed start of new grace periods.
    */
    -static void rcu_process_dyntick(struct rcu_state *rsp,
    - int (*f)(struct rcu_data *))
    +static void force_qs_rnp(struct rcu_state *rsp, int (*f)(struct rcu_data *))
    {
    unsigned long bit;
    int cpu;
    @@ -1172,7 +1171,7 @@ static void rcu_process_dyntick(struct rcu_state *rsp,
    if ((rnp->qsmask & bit) != 0 && f(rsp->rda[cpu]))
    mask |= bit;
    }
    - if (mask != 0 && rcu_gp_in_progress(rsp)) {
    + if (mask != 0) {

    /* rcu_report_qs_rnp() releases rnp->lock. */
    rcu_report_qs_rnp(mask, rsp, rnp, flags);
    @@ -1222,7 +1221,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)
    break; /* So gcc recognizes the dead code. */

    /* Record dyntick-idle state. */
    - rcu_process_dyntick(rsp, dyntick_save_progress_counter);
    + force_qs_rnp(rsp, dyntick_save_progress_counter);
    spin_lock(&rnp->lock); /* irqs already disabled */
    if (rcu_gp_in_progress(rsp))
    rsp->signaled = RCU_FORCE_QS;
    @@ -1232,7 +1231,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed)

    /* Check dyntick-idle state, send IPI to laggarts. */
    spin_unlock(&rnp->lock); /* irqs remain disabled */
    - rcu_process_dyntick(rsp, rcu_implicit_dynticks_qs);
    + force_qs_rnp(rsp, rcu_implicit_dynticks_qs);

    /* Leave state in case more forcing is required. */

    --
    1.5.2.5


    \
     
     \ /
      Last update: 2009-12-16 00:13    [W:3.725 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site