From b8ff63e3c7a2f287d5686b429b3bcd3b3eedb0c2 Mon Sep 17 00:00:00 2001 From: Andy Ross Date: Thu, 23 Jan 2020 12:55:04 -0800 Subject: [PATCH] kernel/sem: Fix SMP race This had the same race that queue did: you have to be 100% done with state management before calling z_ready_thread(), because another CPU can pick up the thread before the return value was set. Signed-off-by: Andy Ross --- kernel/sem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/sem.c b/kernel/sem.c index 00c0353e302..9b0514358ab 100644 --- a/kernel/sem.c +++ b/kernel/sem.c @@ -113,8 +113,8 @@ void z_impl_k_sem_give(struct k_sem *sem) sys_trace_void(SYS_TRACE_ID_SEMA_GIVE); if (thread != NULL) { - z_ready_thread(thread); arch_thread_return_value_set(thread, 0); + z_ready_thread(thread); } else { sem->count += (sem->count != sem->limit) ? 1U : 0U; handle_poll_events(sem);