[PATCH v3 05/12] smp: Free call_function_data via RCU in smpcfd_dead_cpu

From: Chuyi Zhou

Date: Wed Mar 18 2026 - 01:00:18 EST


Use rcu_read_lock() to protect csd in smp_call_function_many_cond() and
wait for all read critical sections to exit before releasing percpu csd
data. This is preparation for enabling preemption during csd_lock_wait()
and can prevent accessing cfd->csd data that has already been freed in
smpcfd_dead_cpu().

Signed-off-by: Chuyi Zhou <zhouchuyi@xxxxxxxxxxxxx>
---
kernel/smp.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/kernel/smp.c b/kernel/smp.c
index 9728ba55944d..32c293d8be0e 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -77,6 +77,7 @@ int smpcfd_dead_cpu(unsigned int cpu)
{
struct call_function_data *cfd = &per_cpu(cfd_data, cpu);

+ synchronize_rcu();
free_cpumask_var(cfd->cpumask);
free_cpumask_var(cfd->cpumask_ipi);
free_percpu(cfd->csd);
@@ -810,6 +811,7 @@ static void smp_call_function_many_cond(const struct cpumask *mask,

lockdep_assert_preemption_disabled();

+ rcu_read_lock();
cfd = this_cpu_ptr(&cfd_data);
cpumask = cfd->cpumask;

@@ -905,6 +907,7 @@ static void smp_call_function_many_cond(const struct cpumask *mask,
}
}

+ rcu_read_unlock();
if (preemptible_wait)
free_cpumask_var(cpumask_stack);
}
--
2.20.1