|
@@ -245,21 +245,21 @@ static int rcu_gp_in_progress(struct rcu_state *rsp)
|
|
*/
|
|
*/
|
|
void rcu_sched_qs(void)
|
|
void rcu_sched_qs(void)
|
|
{
|
|
{
|
|
- if (__this_cpu_read(rcu_sched_data.cpu_no_qs)) {
|
|
|
|
|
|
+ if (__this_cpu_read(rcu_sched_data.cpu_no_qs.s)) {
|
|
trace_rcu_grace_period(TPS("rcu_sched"),
|
|
trace_rcu_grace_period(TPS("rcu_sched"),
|
|
__this_cpu_read(rcu_sched_data.gpnum),
|
|
__this_cpu_read(rcu_sched_data.gpnum),
|
|
TPS("cpuqs"));
|
|
TPS("cpuqs"));
|
|
- __this_cpu_write(rcu_sched_data.cpu_no_qs, false);
|
|
|
|
|
|
+ __this_cpu_write(rcu_sched_data.cpu_no_qs.b.norm, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void rcu_bh_qs(void)
|
|
void rcu_bh_qs(void)
|
|
{
|
|
{
|
|
- if (__this_cpu_read(rcu_bh_data.cpu_no_qs)) {
|
|
|
|
|
|
+ if (__this_cpu_read(rcu_bh_data.cpu_no_qs.s)) {
|
|
trace_rcu_grace_period(TPS("rcu_bh"),
|
|
trace_rcu_grace_period(TPS("rcu_bh"),
|
|
__this_cpu_read(rcu_bh_data.gpnum),
|
|
__this_cpu_read(rcu_bh_data.gpnum),
|
|
TPS("cpuqs"));
|
|
TPS("cpuqs"));
|
|
- __this_cpu_write(rcu_bh_data.cpu_no_qs, false);
|
|
|
|
|
|
+ __this_cpu_write(rcu_bh_data.cpu_no_qs.b.norm, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1744,7 +1744,7 @@ static bool __note_gp_changes(struct rcu_state *rsp, struct rcu_node *rnp,
|
|
*/
|
|
*/
|
|
rdp->gpnum = rnp->gpnum;
|
|
rdp->gpnum = rnp->gpnum;
|
|
trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("cpustart"));
|
|
trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("cpustart"));
|
|
- rdp->cpu_no_qs = true;
|
|
|
|
|
|
+ rdp->cpu_no_qs.b.norm = true;
|
|
rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_qs_ctr);
|
|
rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_qs_ctr);
|
|
rdp->core_needs_qs = !!(rnp->qsmask & rdp->grpmask);
|
|
rdp->core_needs_qs = !!(rnp->qsmask & rdp->grpmask);
|
|
zero_cpu_stall_ticks(rdp);
|
|
zero_cpu_stall_ticks(rdp);
|
|
@@ -2337,7 +2337,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp)
|
|
rnp = rdp->mynode;
|
|
rnp = rdp->mynode;
|
|
raw_spin_lock_irqsave(&rnp->lock, flags);
|
|
raw_spin_lock_irqsave(&rnp->lock, flags);
|
|
smp_mb__after_unlock_lock();
|
|
smp_mb__after_unlock_lock();
|
|
- if ((rdp->cpu_no_qs &&
|
|
|
|
|
|
+ if ((rdp->cpu_no_qs.b.norm &&
|
|
rdp->rcu_qs_ctr_snap == __this_cpu_read(rcu_qs_ctr)) ||
|
|
rdp->rcu_qs_ctr_snap == __this_cpu_read(rcu_qs_ctr)) ||
|
|
rdp->gpnum != rnp->gpnum || rnp->completed == rnp->gpnum ||
|
|
rdp->gpnum != rnp->gpnum || rnp->completed == rnp->gpnum ||
|
|
rdp->gpwrap) {
|
|
rdp->gpwrap) {
|
|
@@ -2348,7 +2348,7 @@ rcu_report_qs_rdp(int cpu, struct rcu_state *rsp, struct rcu_data *rdp)
|
|
* We will instead need a new quiescent state that lies
|
|
* We will instead need a new quiescent state that lies
|
|
* within the current grace period.
|
|
* within the current grace period.
|
|
*/
|
|
*/
|
|
- rdp->cpu_no_qs = true; /* need qs for new gp. */
|
|
|
|
|
|
+ rdp->cpu_no_qs.b.norm = true; /* need qs for new gp. */
|
|
rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_qs_ctr);
|
|
rdp->rcu_qs_ctr_snap = __this_cpu_read(rcu_qs_ctr);
|
|
raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
|
return;
|
|
return;
|
|
@@ -2395,7 +2395,7 @@ rcu_check_quiescent_state(struct rcu_state *rsp, struct rcu_data *rdp)
|
|
* Was there a quiescent state since the beginning of the grace
|
|
* Was there a quiescent state since the beginning of the grace
|
|
* period? If no, then exit and wait for the next call.
|
|
* period? If no, then exit and wait for the next call.
|
|
*/
|
|
*/
|
|
- if (rdp->cpu_no_qs &&
|
|
|
|
|
|
+ if (rdp->cpu_no_qs.b.norm &&
|
|
rdp->rcu_qs_ctr_snap == __this_cpu_read(rcu_qs_ctr))
|
|
rdp->rcu_qs_ctr_snap == __this_cpu_read(rcu_qs_ctr))
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -3828,11 +3828,11 @@ static int __rcu_pending(struct rcu_state *rsp, struct rcu_data *rdp)
|
|
|
|
|
|
/* Is the RCU core waiting for a quiescent state from this CPU? */
|
|
/* Is the RCU core waiting for a quiescent state from this CPU? */
|
|
if (rcu_scheduler_fully_active &&
|
|
if (rcu_scheduler_fully_active &&
|
|
- rdp->core_needs_qs && rdp->cpu_no_qs &&
|
|
|
|
|
|
+ rdp->core_needs_qs && rdp->cpu_no_qs.b.norm &&
|
|
rdp->rcu_qs_ctr_snap == __this_cpu_read(rcu_qs_ctr)) {
|
|
rdp->rcu_qs_ctr_snap == __this_cpu_read(rcu_qs_ctr)) {
|
|
rdp->n_rp_core_needs_qs++;
|
|
rdp->n_rp_core_needs_qs++;
|
|
} else if (rdp->core_needs_qs &&
|
|
} else if (rdp->core_needs_qs &&
|
|
- (!rdp->cpu_no_qs ||
|
|
|
|
|
|
+ (!rdp->cpu_no_qs.b.norm ||
|
|
rdp->rcu_qs_ctr_snap != __this_cpu_read(rcu_qs_ctr))) {
|
|
rdp->rcu_qs_ctr_snap != __this_cpu_read(rcu_qs_ctr))) {
|
|
rdp->n_rp_report_qs++;
|
|
rdp->n_rp_report_qs++;
|
|
return 1;
|
|
return 1;
|
|
@@ -4155,7 +4155,7 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp)
|
|
rdp->beenonline = true; /* We have now been online. */
|
|
rdp->beenonline = true; /* We have now been online. */
|
|
rdp->gpnum = rnp->completed; /* Make CPU later note any new GP. */
|
|
rdp->gpnum = rnp->completed; /* Make CPU later note any new GP. */
|
|
rdp->completed = rnp->completed;
|
|
rdp->completed = rnp->completed;
|
|
- rdp->cpu_no_qs = true;
|
|
|
|
|
|
+ rdp->cpu_no_qs.b.norm = true;
|
|
rdp->rcu_qs_ctr_snap = per_cpu(rcu_qs_ctr, cpu);
|
|
rdp->rcu_qs_ctr_snap = per_cpu(rcu_qs_ctr, cpu);
|
|
rdp->core_needs_qs = false;
|
|
rdp->core_needs_qs = false;
|
|
trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("cpuonl"));
|
|
trace_rcu_grace_period(rsp->name, rdp->gpnum, TPS("cpuonl"));
|