Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 302757
b: refs/heads/master
c: 4b7a3e9
h: refs/heads/master
i:
  302755: 5af5fb6
v: v3
  • Loading branch information
Lai Jiangshan authored and Paul E. McKenney committed Apr 30, 2012
1 parent 190aaed commit d3b4553
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cef50120b61c2af4ce34bc165e19cad66296f93d
refs/heads/master: 4b7a3e9e32114a09c61995048f055615b5d4c26d
25 changes: 1 addition & 24 deletions trunk/kernel/srcu.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,39 +308,16 @@ 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) &&
!lock_is_held(&rcu_lock_map) &&
!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
Expand Down

0 comments on commit d3b4553

Please sign in to comment.