From 6fd1ca64a1ede81de6b1cb568d4c6f60b9968ce6 Mon Sep 17 00:00:00 2001 From: dulibo1 Date: Thu, 18 Apr 2024 11:23:28 +0800 Subject: [PATCH] sched_smp:sync refcount before enqueue smp call queue Signed-off-by: dulibo1 1.call_data->refcount is not remote_cpus; 2.nxsched_smp_call_add enqueue the call_data; 3.maybe nxsched_smp_call_handler is just doing; 4.dequeue the call_data but call_data->refcount is not corret; 5.unpredictability case will occur; --- sched/sched/sched_smp.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/sched/sched/sched_smp.c b/sched/sched/sched_smp.c index 98437cbb83..b9315ba91a 100644 --- a/sched/sched/sched_smp.c +++ b/sched/sched/sched_smp.c @@ -239,7 +239,8 @@ int nxsched_smp_call(cpu_set_t cpuset, nxsched_smp_call_t func, CPU_CLR(this_cpu(), &cpuset); } - if (CPU_COUNT(&cpuset) == 0) + remote_cpus = CPU_COUNT(&cpuset); + if (remote_cpus == 0) { goto out; } @@ -261,22 +262,17 @@ int nxsched_smp_call(cpu_set_t cpuset, nxsched_smp_call_t func, call_data->func = func; call_data->arg = arg; + call_data->refcount = remote_cpus; for (i = 0; i < CONFIG_SMP_NCPUS; i++) { if (CPU_ISSET(i, &cpuset)) { nxsched_smp_call_add(i, call_data); - remote_cpus++; } } - call_data->refcount = remote_cpus; - - if (remote_cpus > 0) - { - up_send_smp_call(cpuset); - } + up_send_smp_call(cpuset); if (wait) {