rcu: Remove fast check path from __synchronize_srcu()
authorLai Jiangshan <laijs@cn.fujitsu.com>
Wed, 22 Feb 2012 21:06:51 +0000 (13:06 -0800)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Mon, 30 Apr 2012 17:48:20 +0000 (10:48 -0700)
The fastpath in __synchronize_srcu() is designed to handle cases where
there are a large number of concurrent calls for the same srcu_struct
structure.  However, the Linux kernel currently does not use SRCU in
this manner, so remove the fastpath checks for simplicity.

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/srcu.c

index 84c9b97dc3d9d37eb3ad339c22658f9b8485d8ca..17e95bcc901c94b19564b4521fa7478e83c3736e 100644 (file)
@@ -308,7 +308,7 @@ static void flip_idx_and_wait(struct srcu_struct *sp, bool expedited)
  */
 static void __synchronize_srcu(struct srcu_struct *sp, bool expedited)
 {
-       int idx;
+       int idx = 0;
 
        rcu_lockdep_assert(!lock_is_held(&sp->dep_map) &&
                           !lock_is_held(&rcu_bh_lock_map) &&
@@ -316,31 +316,8 @@ static void __synchronize_srcu(struct srcu_struct *sp, bool expedited)
                           !lock_is_held(&rcu_sched_lock_map),
                           "Illegal synchronize_srcu() in same-type SRCU (or RCU) read-side critical section");
 
-       smp_mb();  /* Ensure prior action happens before grace period. */
-       idx = ACCESS_ONCE(sp->completed);
-       smp_mb();  /* Access to ->completed before lock acquisition. */
        mutex_lock(&sp->mutex);
 
-       /*
-        * Check to see if someone else did the work for us while we were
-        * waiting to acquire the lock.  We need -three- advances of
-        * the counter, not just one.  If there was but one, we might have
-        * shown up -after- our helper's first synchronize_sched(), thus
-        * having failed to prevent CPU-reordering races with concurrent
-        * srcu_read_unlock()s on other CPUs (see comment below).  If there
-        * was only two, we are guaranteed to have waited through only one
-        * full index-flip phase.  So we either (1) wait for three or
-        * (2) supply the additional ones we need.
-        */
-
-       if (sp->completed == idx + 2)
-               idx = 1;
-       else if (sp->completed == idx + 3) {
-               mutex_unlock(&sp->mutex);
-               return;
-       } else
-               idx = 0;
-
        /*
         * If there were no helpers, then we need to do two flips of
         * the index.  The first flip is required if there are any