Commit f96e9232e04856c781d4f71923a46dd3f7b429fa
Committed by
Ingo Molnar
1 parent
7284ce6c9f
rcu: Adjust force_quiescent_state() locking, step 1
This causes rnp->lock to be held on entry to force_quiescent_state()'s switch statement. This is a first step towards prohibiting starting grace periods while force_quiescent_state() is executing, which will reduce the number and complexity of races that force_quiescent_state() is involved in. 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: <12626465501455-git-send-email-> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Showing 1 changed file with 18 additions and 9 deletions Side-by-side Diff
kernel/rcutree.c
... | ... | @@ -1204,7 +1204,7 @@ |
1204 | 1204 | } |
1205 | 1205 | if (relaxed && |
1206 | 1206 | (long)(rsp->jiffies_force_qs - jiffies) >= 0) |
1207 | - goto unlock_ret; /* no emergency and done recently. */ | |
1207 | + goto unlock_fqs_ret; /* no emergency and done recently. */ | |
1208 | 1208 | rsp->n_force_qs++; |
1209 | 1209 | spin_lock(&rnp->lock); |
1210 | 1210 | lastcomp = rsp->gpnum - 1; |
1211 | 1211 | |
1212 | 1212 | |
1213 | 1213 | |
1214 | 1214 | |
1215 | 1215 | |
... | ... | @@ -1213,31 +1213,32 @@ |
1213 | 1213 | if(!rcu_gp_in_progress(rsp)) { |
1214 | 1214 | rsp->n_force_qs_ngp++; |
1215 | 1215 | spin_unlock(&rnp->lock); |
1216 | - goto unlock_ret; /* no GP in progress, time updated. */ | |
1216 | + goto unlock_fqs_ret; /* no GP in progress, time updated. */ | |
1217 | 1217 | } |
1218 | - spin_unlock(&rnp->lock); | |
1219 | 1218 | switch (signaled) { |
1220 | 1219 | case RCU_GP_IDLE: |
1221 | 1220 | case RCU_GP_INIT: |
1222 | 1221 | |
1222 | + spin_unlock(&rnp->lock); | |
1223 | 1223 | break; /* grace period idle or initializing, ignore. */ |
1224 | 1224 | |
1225 | 1225 | case RCU_SAVE_DYNTICK: |
1226 | 1226 | |
1227 | + spin_unlock(&rnp->lock); | |
1227 | 1228 | if (RCU_SIGNAL_INIT != RCU_SAVE_DYNTICK) |
1228 | 1229 | break; /* So gcc recognizes the dead code. */ |
1229 | 1230 | |
1230 | 1231 | /* Record dyntick-idle state. */ |
1231 | 1232 | if (rcu_process_dyntick(rsp, lastcomp, |
1232 | 1233 | dyntick_save_progress_counter)) |
1233 | - goto unlock_ret; | |
1234 | + goto unlock_fqs_ret; | |
1235 | + spin_lock(&rnp->lock); | |
1234 | 1236 | /* fall into next case. */ |
1235 | 1237 | |
1236 | 1238 | case RCU_SAVE_COMPLETED: |
1237 | 1239 | |
1238 | 1240 | /* Update state, record completion counter. */ |
1239 | 1241 | forcenow = 0; |
1240 | - spin_lock(&rnp->lock); | |
1241 | 1242 | if (lastcomp + 1 == rsp->gpnum && |
1242 | 1243 | lastcomp == rsp->completed && |
1243 | 1244 | rsp->signaled == signaled) { |
1244 | 1245 | |
1245 | 1246 | |
1246 | 1247 | |
1247 | 1248 | |
1248 | 1249 | |
... | ... | @@ -1245,23 +1246,31 @@ |
1245 | 1246 | rsp->completed_fqs = lastcomp; |
1246 | 1247 | forcenow = signaled == RCU_SAVE_COMPLETED; |
1247 | 1248 | } |
1248 | - spin_unlock(&rnp->lock); | |
1249 | - if (!forcenow) | |
1249 | + if (!forcenow) { | |
1250 | + spin_unlock(&rnp->lock); | |
1250 | 1251 | break; |
1252 | + } | |
1251 | 1253 | /* fall into next case. */ |
1252 | 1254 | |
1253 | 1255 | case RCU_FORCE_QS: |
1254 | 1256 | |
1255 | 1257 | /* Check dyntick-idle state, send IPI to laggarts. */ |
1258 | + spin_unlock(&rnp->lock); | |
1256 | 1259 | if (rcu_process_dyntick(rsp, rsp->completed_fqs, |
1257 | 1260 | rcu_implicit_dynticks_qs)) |
1258 | - goto unlock_ret; | |
1261 | + goto unlock_fqs_ret; | |
1259 | 1262 | |
1260 | 1263 | /* Leave state in case more forcing is required. */ |
1261 | 1264 | |
1262 | 1265 | break; |
1266 | + | |
1267 | + default: | |
1268 | + | |
1269 | + spin_unlock(&rnp->lock); | |
1270 | + WARN_ON_ONCE(1); | |
1271 | + break; | |
1263 | 1272 | } |
1264 | -unlock_ret: | |
1273 | +unlock_fqs_ret: | |
1265 | 1274 | spin_unlock_irqrestore(&rsp->fqslock, flags); |
1266 | 1275 | } |
1267 | 1276 |