diff options
Diffstat (limited to 'kernel/rcutree.c')
-rw-r--r-- | kernel/rcutree.c | 19 |
1 files changed, 4 insertions, 15 deletions
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 7f3266922572..d2a372fb0b9b 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -530,8 +530,6 @@ static void note_new_gpnum(struct rcu_state *rsp, struct rcu_data *rdp) | |||
530 | rdp->qs_pending = 1; | 530 | rdp->qs_pending = 1; |
531 | rdp->passed_quiesc = 0; | 531 | rdp->passed_quiesc = 0; |
532 | rdp->gpnum = rsp->gpnum; | 532 | rdp->gpnum = rsp->gpnum; |
533 | rdp->n_rcu_pending_force_qs = rdp->n_rcu_pending + | ||
534 | RCU_JIFFIES_TILL_FORCE_QS; | ||
535 | } | 533 | } |
536 | 534 | ||
537 | /* | 535 | /* |
@@ -578,8 +576,6 @@ rcu_start_gp(struct rcu_state *rsp, unsigned long flags) | |||
578 | rsp->gpnum++; | 576 | rsp->gpnum++; |
579 | rsp->signaled = RCU_GP_INIT; /* Hold off force_quiescent_state. */ | 577 | rsp->signaled = RCU_GP_INIT; /* Hold off force_quiescent_state. */ |
580 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 578 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; |
581 | rdp->n_rcu_pending_force_qs = rdp->n_rcu_pending + | ||
582 | RCU_JIFFIES_TILL_FORCE_QS; | ||
583 | record_gp_stall_check_time(rsp); | 579 | record_gp_stall_check_time(rsp); |
584 | dyntick_record_completed(rsp, rsp->completed - 1); | 580 | dyntick_record_completed(rsp, rsp->completed - 1); |
585 | note_new_gpnum(rsp, rdp); | 581 | note_new_gpnum(rsp, rdp); |
@@ -1055,7 +1051,6 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1055 | { | 1051 | { |
1056 | unsigned long flags; | 1052 | unsigned long flags; |
1057 | long lastcomp; | 1053 | long lastcomp; |
1058 | struct rcu_data *rdp = rsp->rda[smp_processor_id()]; | ||
1059 | struct rcu_node *rnp = rcu_get_root(rsp); | 1054 | struct rcu_node *rnp = rcu_get_root(rsp); |
1060 | u8 signaled; | 1055 | u8 signaled; |
1061 | 1056 | ||
@@ -1066,16 +1061,13 @@ static void force_quiescent_state(struct rcu_state *rsp, int relaxed) | |||
1066 | return; /* Someone else is already on the job. */ | 1061 | return; /* Someone else is already on the job. */ |
1067 | } | 1062 | } |
1068 | if (relaxed && | 1063 | if (relaxed && |
1069 | (long)(rsp->jiffies_force_qs - jiffies) >= 0 && | 1064 | (long)(rsp->jiffies_force_qs - jiffies) >= 0) |
1070 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) >= 0) | ||
1071 | goto unlock_ret; /* no emergency and done recently. */ | 1065 | goto unlock_ret; /* no emergency and done recently. */ |
1072 | rsp->n_force_qs++; | 1066 | rsp->n_force_qs++; |
1073 | spin_lock(&rnp->lock); | 1067 | spin_lock(&rnp->lock); |
1074 | lastcomp = rsp->completed; | 1068 | lastcomp = rsp->completed; |
1075 | signaled = rsp->signaled; | 1069 | signaled = rsp->signaled; |
1076 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; | 1070 | rsp->jiffies_force_qs = jiffies + RCU_JIFFIES_TILL_FORCE_QS; |
1077 | rdp->n_rcu_pending_force_qs = rdp->n_rcu_pending + | ||
1078 | RCU_JIFFIES_TILL_FORCE_QS; | ||
1079 | if (lastcomp == rsp->gpnum) { | 1071 | if (lastcomp == rsp->gpnum) { |
1080 | rsp->n_force_qs_ngp++; | 1072 | rsp->n_force_qs_ngp++; |
1081 | spin_unlock(&rnp->lock); | 1073 | spin_unlock(&rnp->lock); |
@@ -1144,8 +1136,7 @@ __rcu_process_callbacks(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1144 | * If an RCU GP has gone long enough, go check for dyntick | 1136 | * If an RCU GP has gone long enough, go check for dyntick |
1145 | * idle CPUs and, if needed, send resched IPIs. | 1137 | * idle CPUs and, if needed, send resched IPIs. |
1146 | */ | 1138 | */ |
1147 | if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0 || | 1139 | if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0) |
1148 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) < 0) | ||
1149 | force_quiescent_state(rsp, 1); | 1140 | force_quiescent_state(rsp, 1); |
1150 | 1141 | ||
1151 | /* | 1142 | /* |
@@ -1230,8 +1221,7 @@ __call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu), | |||
1230 | if (unlikely(++rdp->qlen > qhimark)) { | 1221 | if (unlikely(++rdp->qlen > qhimark)) { |
1231 | rdp->blimit = LONG_MAX; | 1222 | rdp->blimit = LONG_MAX; |
1232 | force_quiescent_state(rsp, 0); | 1223 | force_quiescent_state(rsp, 0); |
1233 | } else if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0 || | 1224 | } else if ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0) |
1234 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) < 0) | ||
1235 | force_quiescent_state(rsp, 1); | 1225 | force_quiescent_state(rsp, 1); |
1236 | local_irq_restore(flags); | 1226 | local_irq_restore(flags); |
1237 | } | 1227 | } |
@@ -1290,8 +1280,7 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp) | |||
1290 | 1280 | ||
1291 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ | 1281 | /* Has an RCU GP gone long enough to send resched IPIs &c? */ |
1292 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && | 1282 | if (ACCESS_ONCE(rsp->completed) != ACCESS_ONCE(rsp->gpnum) && |
1293 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0 || | 1283 | ((long)(ACCESS_ONCE(rsp->jiffies_force_qs) - jiffies) < 0)) |
1294 | (rdp->n_rcu_pending_force_qs - rdp->n_rcu_pending) < 0)) | ||
1295 | return 1; | 1284 | return 1; |
1296 | 1285 | ||
1297 | /* nothing to do */ | 1286 | /* nothing to do */ |