@@ -149,7 +149,6 @@ static int rcu_scheduler_fully_active __read_mostly;
static void rcu_report_qs_rnp(unsigned long mask, struct rcu_node *rnp,
unsigned long gps, unsigned long flags);
-static struct task_struct *rcu_boost_task(struct rcu_node *rnp);
static void invoke_rcu_core(void);
static void rcu_report_exp_rdp(struct rcu_data *rdp);
static void sync_sched_exp_online_cleanup(int cpu);
@@ -5008,6 +5007,22 @@ int rcutree_prepare_cpu(unsigned int cpu)
return 0;
}
+static void rcu_thread_affine_rnp(struct task_struct *t, struct rcu_node *rnp)
+{
+ cpumask_var_t affinity;
+ int cpu;
+
+ if (!zalloc_cpumask_var(&affinity, GFP_KERNEL))
+ return;
+
+ for_each_leaf_node_possible_cpu(rnp, cpu)
+ cpumask_set_cpu(cpu, affinity);
+
+ kthread_affine_preferred(t, affinity);
+
+ free_cpumask_var(affinity);
+}
+
/*
* Update kthreads affinity during CPU-hotplug changes.
*
@@ -5027,19 +5042,18 @@ static void rcutree_affinity_setting(unsigned int cpu, int outgoingcpu)
unsigned long mask;
struct rcu_data *rdp;
struct rcu_node *rnp;
- struct task_struct *task_boost, *task_exp;
+ struct task_struct *task_exp;
rdp = per_cpu_ptr(&rcu_data, cpu);
rnp = rdp->mynode;
- task_boost = rcu_boost_task(rnp);
task_exp = rcu_exp_par_gp_task(rnp);
/*
- * If CPU is the boot one, those tasks are created later from early
+ * If CPU is the boot one, this task is created later from early
* initcall since kthreadd must be created first.
*/
- if (!task_boost && !task_exp)
+ if (!task_exp)
return;
if (!zalloc_cpumask_var(&cm, GFP_KERNEL))
@@ -5061,9 +5075,6 @@ static void rcutree_affinity_setting(unsigned int cpu, int outgoingcpu)
if (task_exp)
set_cpus_allowed_ptr(task_exp, cm);
- if (task_boost)
- set_cpus_allowed_ptr(task_boost, cm);
-
mutex_unlock(&rnp->kthread_mutex);
free_cpumask_var(cm);
@@ -1217,16 +1217,13 @@ static void rcu_spawn_one_boost_kthread(struct rcu_node *rnp)
raw_spin_lock_irqsave_rcu_node(rnp, flags);
rnp->boost_kthread_task = t;
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
+
sp.sched_priority = kthread_prio;
sched_setscheduler_nocheck(t, SCHED_FIFO, &sp);
+ rcu_thread_affine_rnp(t, rnp);
wake_up_process(t); /* get to TASK_INTERRUPTIBLE quickly. */
}
-static struct task_struct *rcu_boost_task(struct rcu_node *rnp)
-{
- return READ_ONCE(rnp->boost_kthread_task);
-}
-
#else /* #ifdef CONFIG_RCU_BOOST */
static void rcu_initiate_boost(struct rcu_node *rnp, unsigned long flags)
@@ -1243,10 +1240,6 @@ static void rcu_spawn_one_boost_kthread(struct rcu_node *rnp)
{
}
-static struct task_struct *rcu_boost_task(struct rcu_node *rnp)
-{
- return NULL;
-}
#endif /* #else #ifdef CONFIG_RCU_BOOST */
/*