diff options
Diffstat (limited to 'kernel/rcutree.c')
-rw-r--r-- | kernel/rcutree.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 1d8cfb1711fd..62b64332effb 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -1191,7 +1191,6 @@ static int rcu_process_dyntick(struct rcu_state *rsp, long lastcomp, | |||
1191 | static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | 1191 | static void force_quiescent_state(struct rcu_state *rsp, int relaxed) |
1192 | { | 1192 | { |
1193 | unsigned long flags; | 1193 | unsigned long flags; |
1194 | long lastcomp; | ||
1195 | struct rcu_node *rnp = rcu_get_root(rsp); | 1194 | struct rcu_node *rnp = rcu_get_root(rsp); |
1196 | u8 forcenow; | 1195 | u8 forcenow; |
1197 | u8 gpdone; | 1196 | u8 gpdone; |
@@ -1207,7 +1206,6 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1207 | goto unlock_fqs_ret; /* no emergency and done recently. */ | 1206 | goto unlock_fqs_ret; /* no emergency and done recently. */ |
1208 | rsp->n_force_qs++; | 1207 | rsp->n_force_qs++; |
1209 | spin_lock(&rnp->lock); /* irqs already disabled */ | 1208 | spin_lock(&rnp->lock); /* irqs already disabled */ |
1210 | lastcomp = rsp->gpnum - 1; | ||
1211 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 1209 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; |
1212 | if(!rcu_gp_in_progress(rsp)) { | 1210 | if(!rcu_gp_in_progress(rsp)) { |
1213 | rsp->n_force_qs_ngp++; | 1211 | rsp->n_force_qs_ngp++; |
@@ -1228,7 +1226,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1228 | break; /* So gcc recognizes the dead code. */ | 1226 | break; /* So gcc recognizes the dead code. */ |
1229 | 1227 | ||
1230 | /* Record dyntick-idle state. */ | 1228 | /* Record dyntick-idle state. */ |
1231 | gpdone = rcu_process_dyntick(rsp, lastcomp, | 1229 | gpdone = rcu_process_dyntick(rsp, rsp->gpnum - 1, |
1232 | dyntick_save_progress_counter); | 1230 | dyntick_save_progress_counter); |
1233 | spin_lock(&rnp->lock); /* irqs already disabled */ | 1231 | spin_lock(&rnp->lock); /* irqs already disabled */ |
1234 | if (gpdone) | 1232 | if (gpdone) |
@@ -1239,11 +1237,9 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1239 | 1237 | ||
1240 | /* Update state, record completion counter. */ | 1238 | /* Update state, record completion counter. */ |
1241 | forcenow = 0; | 1239 | forcenow = 0; |
1242 | if (lastcomp + 1 == rsp->gpnum && | 1240 | if (rsp->gpnum - 1 == rsp->completed) { |
1243 | lastcomp == rsp->completed) { | ||
1244 | forcenow = rsp->signaled == RCU_SAVE_COMPLETED; | 1241 | forcenow = rsp->signaled == RCU_SAVE_COMPLETED; |
1245 | rsp->signaled = RCU_FORCE_QS; | 1242 | rsp->signaled = RCU_FORCE_QS; |
1246 | rsp->completed_fqs = lastcomp; | ||
1247 | } | 1243 | } |
1248 | if (!forcenow) | 1244 | if (!forcenow) |
1249 | break; | 1245 | break; |
@@ -1253,7 +1249,7 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1253 | 1249 | ||
1254 | /* Check dyntick-idle state, send IPI to laggarts. */ | 1250 | /* Check dyntick-idle state, send IPI to laggarts. */ |
1255 | spin_unlock(&rnp->lock); /* irqs remain disabled */ | 1251 | spin_unlock(&rnp->lock); /* irqs remain disabled */ |
1256 | gpdone = rcu_process_dyntick(rsp, rsp->completed_fqs, | 1252 | gpdone = rcu_process_dyntick(rsp, rsp->gpnum - 1, |
1257 | rcu_implicit_dynticks_qs); | 1253 | rcu_implicit_dynticks_qs); |
1258 | 1254 | ||
1259 | /* Leave state in case more forcing is required. */ | 1255 | /* Leave state in case more forcing is required. */ |