zephyr/kernel
Andy Ross 7dee7a6139 kernel/sched: Fix race with thread return values
There was a brief (but seen in practice on real apps on real
hardware!) race with the switch-based z_swap() implementation.  The
thread return value was being initialized to -EAGAIN after the
enclosing lock had been released.  But that lock is supposed to be
atomic with the thread suspend.

This opened a window for another racing thread to come by and "wake
up" our pending thread (which is fine on its own), set its return
value (e.g. to 0 for success) and then have that value clobbered by
the thread continuing to suspend itself outside the lock.

Melodramatic aside: I continue to hate this
arch_thread_return_value_set() API; it needs to die.  At best it's a
mild optimization on a handful of architectures (e.g. x86 implements
it by writing to the EAX register save slot in the context block).
Asynchronous APIs are almost always worse than synchronous ones, and
in this case it's an async operation that races against literal
context switch code that can't use traditional locking strategies.

Fixes #39575

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2021-10-25 12:31:06 +02:00
..
include kernel/sched: Fix race with thread return values 2021-10-25 12:31:06 +02:00
paging kernel: mmu: z_backing_store* to k_mem_paging_backing_store* 2021-05-28 11:33:22 -04:00
atomic_c.c kernel: atomic: consistently use named type for atomic pointer values 2021-04-19 15:22:13 +02:00
banner.c kernel: init: move banner handling 2020-11-27 20:08:14 -05:00
cache_handlers.c cache: Rename sys_{dcache,icache}_* to sys_{data,instr}_cache_* 2021-05-08 07:00:33 +02:00
CMakeLists.txt kernel: add support for event objects 2021-10-16 06:27:10 -04:00
compiler_stack_protect.c tests: coverage: exclude the CODE UNREACHABLE of code coverage 2021-01-15 12:42:00 -05:00
condvar.c Tracing: Conditional variable tracing 2021-05-07 22:10:21 -04:00
device.c Revert "device: supported devices visitor API" 2021-09-30 21:37:59 -04:00
errno.c kernel: support using thread local storage for errno 2020-10-24 10:52:00 -07:00
events.c kernel: add support for event objects 2021-10-16 06:27:10 -04:00
fatal.c kernel: fatal: Avoid thread api access when no multithreading 2021-04-29 14:50:35 +02:00
futex.c futex: Avoid unnecessary lock 2021-07-30 20:21:04 -04:00
idle.c kernel/sched: Remove "cooperative scheduling only" special cases 2021-05-24 23:38:16 -04:00
init.c kernel: init: remove empty lcov exclusion 2021-09-06 08:18:15 -04:00
Kconfig kernel: add support for event objects 2021-10-16 06:27:10 -04:00
kheap.c kernel: kheap: make init work with demand paging 2021-08-26 21:16:22 -04:00
mailbox.c comments: minor typo fixes 2021-10-05 07:18:13 -04:00
main_weak.c kernel: extract __weak main() into independent file 2021-08-28 08:48:03 -04:00
mem_domain.c kernel: Make both operands of operators of same essential type category 2021-04-01 05:34:17 -04:00
mem_slab.c toolchain: migrate iterable sections calls to the external API 2021-08-12 17:47:04 -04:00
mempool.c Tracing: Memory Heap tracing 2021-05-07 22:10:21 -04:00
mmu.c mmu: fix virt_region_alloc() unused region free when aligned 2021-10-13 06:24:56 -04:00
msg_q.c kernel: remove object tracing 2021-05-07 22:10:21 -04:00
mutex.c kernel: Fix negative mutex lock_count value 2021-07-06 19:19:41 -04:00
pipes.c kernel: remove object tracing 2021-05-07 22:10:21 -04:00
poll.c comments: minor typo fixes 2021-10-05 07:18:13 -04:00
queue.c kernel: remove object tracing 2021-05-07 22:10:21 -04:00
sched.c kernel/sched: Add CONFIG_CPU_MASK_PIN_ONLY 2021-09-28 20:15:05 -04:00
sem.c kernel: remove object tracing 2021-05-07 22:10:21 -04:00
smp.c soc: intel_adsp/cavs_v25: Add CPU halt and relaunch APIs 2021-09-03 07:19:34 -04:00
stack.c kernel: remove object tracing 2021-05-07 22:10:21 -04:00
system_work_q.c kernel: remove old work queue implementation 2021-03-03 20:06:00 -05:00
thread.c kernel: thread.c: remove unused THREAD_COOKIE macro. 2021-10-22 18:08:56 -04:00
timeout.c kernel: fix several typos in a comment in timeout.c 2021-07-23 16:06:54 -04:00
timer.c timer: mask interrupts in timer's timeout handler. 2021-09-29 09:18:12 -04:00
userspace.c kernel: app_smem: allowing pinning memory partitions 2021-08-26 21:16:22 -04:00
userspace_handler.c userspace: update k_object API to support immutable objects 2020-09-02 13:48:13 +02:00
version.c zephyr: replace zephyr integer types with C99 types 2020-06-08 08:23:57 -05:00
work.c kernel: work_q: use flags_get() in work_delayable_busy_get_locked(). 2021-10-16 06:23:46 -04:00
xip.c linker: align __itcm_load_start / __dtcm_data_load_start linker symbols 2021-08-28 08:48:03 -04:00