diff options
| author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2009-12-02 15:10:15 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-12-03 05:35:25 -0500 |
| commit | d9a3da0699b24a589b27a61e1a5b5bd30d9db669 (patch) | |
| tree | f7440e396a6c818f3cef514ccc31ab55d88025ef /kernel/rcutree_trace.c | |
| parent | cf244dc01bf68e1ad338b82447f8686d24ea4435 (diff) | |
rcu: Add expedited grace-period support for preemptible RCU
Implement an synchronize_rcu_expedited() for preemptible RCU
that actually is expedited. This uses
synchronize_sched_expedited() to force all threads currently
running in a preemptible-RCU read-side critical section onto the
appropriate ->blocked_tasks[] list, then takes a snapshot of all
of these lists and waits for them to drain.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: laijs@cn.fujitsu.com
Cc: dipankar@in.ibm.com
Cc: mathieu.desnoyers@polymtl.ca
Cc: josh@joshtriplett.org
Cc: dvhltc@us.ibm.com
Cc: niv@us.ibm.com
Cc: peterz@infradead.org
Cc: rostedt@goodmis.org
Cc: Valdis.Kletnieks@vt.edu
Cc: dhowells@redhat.com
LKML-Reference: <1259784616158-git-send-email->
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/rcutree_trace.c')
| -rw-r--r-- | kernel/rcutree_trace.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/rcutree_trace.c b/kernel/rcutree_trace.c index 1984cdc51e9a..9d2c88423b31 100644 --- a/kernel/rcutree_trace.c +++ b/kernel/rcutree_trace.c | |||
| @@ -157,6 +157,7 @@ static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp) | |||
| 157 | { | 157 | { |
| 158 | long gpnum; | 158 | long gpnum; |
| 159 | int level = 0; | 159 | int level = 0; |
| 160 | int phase; | ||
| 160 | struct rcu_node *rnp; | 161 | struct rcu_node *rnp; |
| 161 | 162 | ||
| 162 | gpnum = rsp->gpnum; | 163 | gpnum = rsp->gpnum; |
| @@ -173,10 +174,13 @@ static void print_one_rcu_state(struct seq_file *m, struct rcu_state *rsp) | |||
| 173 | seq_puts(m, "\n"); | 174 | seq_puts(m, "\n"); |
| 174 | level = rnp->level; | 175 | level = rnp->level; |
| 175 | } | 176 | } |
| 176 | seq_printf(m, "%lx/%lx %c>%c %d:%d ^%d ", | 177 | phase = gpnum & 0x1; |
| 178 | seq_printf(m, "%lx/%lx %c%c>%c%c %d:%d ^%d ", | ||
| 177 | rnp->qsmask, rnp->qsmaskinit, | 179 | rnp->qsmask, rnp->qsmaskinit, |
| 178 | "T."[list_empty(&rnp->blocked_tasks[gpnum & 1])], | 180 | "T."[list_empty(&rnp->blocked_tasks[phase])], |
| 179 | "T."[list_empty(&rnp->blocked_tasks[!(gpnum & 1)])], | 181 | "E."[list_empty(&rnp->blocked_tasks[phase + 2])], |
| 182 | "T."[list_empty(&rnp->blocked_tasks[!phase])], | ||
| 183 | "E."[list_empty(&rnp->blocked_tasks[!phase + 2])], | ||
| 180 | rnp->grplo, rnp->grphi, rnp->grpnum); | 184 | rnp->grplo, rnp->grphi, rnp->grpnum); |
| 181 | } | 185 | } |
| 182 | seq_puts(m, "\n"); | 186 | seq_puts(m, "\n"); |
