|
@@ -3665,6 +3665,8 @@ int rcutree_dead_cpu(unsigned int cpu)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static DEFINE_PER_CPU(int, rcu_cpu_started);
|
|
|
+
|
|
|
/*
|
|
|
* Mark the specified CPU as being online so that subsequent grace periods
|
|
|
* (both expedited and normal) will wait on it. Note that this means that
|
|
@@ -3686,6 +3688,11 @@ void rcu_cpu_starting(unsigned int cpu)
|
|
|
struct rcu_node *rnp;
|
|
|
struct rcu_state *rsp;
|
|
|
|
|
|
+ if (per_cpu(rcu_cpu_started, cpu))
|
|
|
+ return;
|
|
|
+
|
|
|
+ per_cpu(rcu_cpu_started, cpu) = 1;
|
|
|
+
|
|
|
for_each_rcu_flavor(rsp) {
|
|
|
rdp = per_cpu_ptr(rsp->rda, cpu);
|
|
|
rnp = rdp->mynode;
|
|
@@ -3742,6 +3749,8 @@ void rcu_report_dead(unsigned int cpu)
|
|
|
preempt_enable();
|
|
|
for_each_rcu_flavor(rsp)
|
|
|
rcu_cleanup_dying_idle_cpu(cpu, rsp);
|
|
|
+
|
|
|
+ per_cpu(rcu_cpu_started, cpu) = 0;
|
|
|
}
|
|
|
|
|
|
/* Migrate the dead CPU's callbacks to the current CPU. */
|