summaryrefslogtreecommitdiff
path: root/kernel/rcu/tree.c
diff options
context:
space:
mode:
authorFrederic Weisbecker <frederic@kernel.org>2024-09-27 00:49:05 +0200
committerFrederic Weisbecker <frederic@kernel.org>2025-01-08 18:15:03 +0100
commitdb7ee3cb620b2cec5a5f44767ab93cb4eb80d961 (patch)
tree5b15eeaf79ff410449bae97236b28398e5036bac /kernel/rcu/tree.c
parent4d13f4304fa43471bfea101658a11feec7b28ac0 (diff)
downloadlwn-db7ee3cb620b2cec5a5f44767ab93cb4eb80d961.tar.gz
lwn-db7ee3cb620b2cec5a5f44767ab93cb4eb80d961.zip
rcu: Use kthread preferred affinity for RCU boost
Now that kthreads have an infrastructure to handle preferred affinity against CPU hotplug and housekeeping cpumask, convert RCU boost to use it instead of handling all the constraints by itself. Acked-by: Paul E. McKenney <paulmck@kernel.org> Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Diffstat (limited to 'kernel/rcu/tree.c')
-rw-r--r--kernel/rcu/tree.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index ff98233d4aa5..4a4c49821058 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -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);
@@ -5011,6 +5010,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.
*
@@ -5030,19 +5045,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))
@@ -5064,9 +5078,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);