lkml.org 
[lkml]   [2011]   [Nov]   [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 11/28] rcu: Omit self-awaken when setting up expedited grace period
    Date
    From: Thomas Gleixner <tglx@linutronix.de>

    When setting up an expedited grace period, if there were no readers, the
    task will awaken itself. This commit removes this useless self-awakening.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---
    kernel/rcutree.c | 2 +-
    kernel/rcutree.h | 3 ++-
    kernel/rcutree_plugin.h | 17 +++++++++++------
    3 files changed, 14 insertions(+), 8 deletions(-)

    diff --git a/kernel/rcutree.c b/kernel/rcutree.c
    index c097394..bbcafba 100644
    --- a/kernel/rcutree.c
    +++ b/kernel/rcutree.c
    @@ -1320,7 +1320,7 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp)
    else
    raw_spin_unlock_irqrestore(&rnp->lock, flags);
    if (need_report & RCU_OFL_TASKS_EXP_GP)
    - rcu_report_exp_rnp(rsp, rnp);
    + rcu_report_exp_rnp(rsp, rnp, true);
    rcu_node_kthread_setaffinity(rnp, -1);
    }

    diff --git a/kernel/rcutree.h b/kernel/rcutree.h
    index 0963fa1..fd2f87d 100644
    --- a/kernel/rcutree.h
    +++ b/kernel/rcutree.h
    @@ -444,7 +444,8 @@ static void rcu_preempt_check_callbacks(int cpu);
    static void rcu_preempt_process_callbacks(void);
    void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu));
    #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU)
    -static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp);
    +static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
    + bool wake);
    #endif /* #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) */
    static int rcu_preempt_pending(int cpu);
    static int rcu_preempt_needs_cpu(int cpu);
    diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
    index 708dc57..7a7961f 100644
    --- a/kernel/rcutree_plugin.h
    +++ b/kernel/rcutree_plugin.h
    @@ -410,7 +410,7 @@ static noinline void rcu_read_unlock_special(struct task_struct *t)
    * then we need to report up the rcu_node hierarchy.
    */
    if (!empty_exp && empty_exp_now)
    - rcu_report_exp_rnp(&rcu_preempt_state, rnp);
    + rcu_report_exp_rnp(&rcu_preempt_state, rnp, true);
    } else {
    local_irq_restore(flags);
    }
    @@ -732,9 +732,13 @@ static int sync_rcu_preempt_exp_done(struct rcu_node *rnp)
    * recursively up the tree. (Calm down, calm down, we do the recursion
    * iteratively!)
    *
    + * Most callers will set the "wake" flag, but the task initiating the
    + * expedited grace period need not wake itself.
    + *
    * Caller must hold sync_rcu_preempt_exp_mutex.
    */
    -static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
    +static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
    + bool wake)
    {
    unsigned long flags;
    unsigned long mask;
    @@ -747,7 +751,8 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
    }
    if (rnp->parent == NULL) {
    raw_spin_unlock_irqrestore(&rnp->lock, flags);
    - wake_up(&sync_rcu_preempt_exp_wq);
    + if (wake)
    + wake_up(&sync_rcu_preempt_exp_wq);
    break;
    }
    mask = rnp->grpmask;
    @@ -780,7 +785,7 @@ sync_rcu_preempt_exp_init(struct rcu_state *rsp, struct rcu_node *rnp)
    must_wait = 1;
    }
    if (!must_wait)
    - rcu_report_exp_rnp(rsp, rnp);
    + rcu_report_exp_rnp(rsp, rnp, false); /* Don't wake self. */
    }

    /*
    @@ -1072,9 +1077,9 @@ EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
    * report on tasks preempted in RCU read-side critical sections during
    * expedited RCU grace periods.
    */
    -static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
    +static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
    + bool wake)
    {
    - return;
    }

    #endif /* #ifdef CONFIG_HOTPLUG_CPU */
    --
    1.7.3.2


    \
     
     \ /
      Last update: 2011-11-02 21:39    [W:4.080 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site