lkml.org 
[lkml]   [2007]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC PATCH 3/6] Preempt-RCU: Fix rcu_barrier for preemptive environment
    Preempt-RCU: Fix rcu_barrier for preemptive environment.

    From: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

    Fix rcu_barrier() to work properly in preemptive kernel environment.
    Also, the ordering of callback must be preserved while moving
    callbacks to another CPU during CPU hotplug.

    Signed-off-by: Gautham R Shenoy <ego@in.ibm.com>
    Signed-off-by: Dipankar Sarma <dipankar@in.ibm.com>
    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    ---

    kernel/rcuclassic.c | 2 +-
    kernel/rcupdate.c | 10 ++++++++++
    2 files changed, 11 insertions(+), 1 deletions(-)

    diff --git a/kernel/rcuclassic.c b/kernel/rcuclassic.c
    index 11c16aa..deb2acc 100644
    --- a/kernel/rcuclassic.c
    +++ b/kernel/rcuclassic.c
    @@ -371,9 +371,9 @@ static void __rcu_offline_cpu(struct rcu_data *this_rdp,
    if (rcp->cur != rcp->completed)
    cpu_quiet(rdp->cpu, rcp);
    spin_unlock_bh(&rcp->lock);
    + rcu_move_batch(this_rdp, rdp->donelist, rdp->donetail);
    rcu_move_batch(this_rdp, rdp->curlist, rdp->curtail);
    rcu_move_batch(this_rdp, rdp->nxtlist, rdp->nxttail);
    - rcu_move_batch(this_rdp, rdp->donelist, rdp->donetail);
    }

    static void rcu_offline_cpu(int cpu)
    diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c
    index 0ccd009..760dfc2 100644
    --- a/kernel/rcupdate.c
    +++ b/kernel/rcupdate.c
    @@ -115,7 +115,17 @@ void rcu_barrier(void)
    mutex_lock(&rcu_barrier_mutex);
    init_completion(&rcu_barrier_completion);
    atomic_set(&rcu_barrier_cpu_count, 0);
    + /*
    + * The queueing of callbacks in all CPUs must be atomic with
    + * respect to RCU, otherwise one CPU may queue a callback,
    + * wait for a grace period, decrement barrier count and call
    + * complete(), while other CPUs have not yet queued anything.
    + * So, we need to make sure that grace periods cannot complete
    + * until all the callbacks are queued.
    + */
    + rcu_read_lock();
    on_each_cpu(rcu_barrier_func, NULL, 0, 1);
    + rcu_read_unlock();
    wait_for_completion(&rcu_barrier_completion);
    mutex_unlock(&rcu_barrier_mutex);
    }
    --
    Gautham R Shenoy
    Linux Technology Center
    IBM India.
    "Freedom comes with a price tag of responsibility, which is still a bargain,
    because Freedom is priceless!"

    \
     
     \ /
      Last update: 2007-12-13 18:21    [W:4.544 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site