zephyr/kernel
Andy Ross e664c78b82 kernel/timeout: Fix recursive spinlock in z_set_timeout_expiry()
The z_set_timeout_expiry() function was added in part to simply the
locking strategy, but it missed a case where a function it was calling
was re-locking the same spinlock.  It "works"[1] in uniprocessor
environments, but can be a deadlock in SMP.

Fix this by moving the meat of the function to an unlocked utility,
use that locally, and turn the entry point into one that does locking.
Actually this only gets called from idle now, which is a use case that
will go away when TICKLESS_IDLE is removed as a separate feature (once
you know all timeouts are set tickless, you don't need to set it from
the idle entry at all).

Discovered via lucky inspection.

[1] It doesn't work.  It releases the lock prematurely at the end of
the inner block.  But in practice this wasn't discovered.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2019-01-18 06:48:51 -05:00
..
include kernel/swap: Simply/robustify return value handling 2019-01-11 15:18:52 -05:00
atomic_c.c license: Replace Apache boilerplate with SPDX tag 2017-01-19 03:50:58 +00:00
CMakeLists.txt kernel: remove k_alert API 2019-01-16 21:34:07 -05:00
compiler_stack_protect.c kernel: add CODE_UNREACHABLE in _StackCheckHandler 2018-04-17 10:50:12 -07:00
device.c kernel: check retval of driver init 2018-12-07 19:33:23 -05:00
errno.c kernel: userspace: reserve stack space to store local data 2018-08-17 09:40:52 -07:00
idle.c power: rename api sys_soc -> sys_ 2018-12-28 16:16:28 -05:00
init.c Gcov: Enable Code coverage reporting over UART. 2019-01-16 06:12:33 -05:00
int_latency_bench.c kernel: Make statements evaluate boolean expressions 2019-01-07 08:52:07 -05:00
Kconfig Gcov: Added Kconfig changes needed by Gcov. 2019-01-16 06:12:33 -05:00
Kconfig.power_mgmt kernel: ensure System Power Managment enables Tickless Idle. 2018-11-21 23:16:35 -05:00
mailbox.c kernel: Make statements evaluate boolean expressions 2019-01-07 08:52:07 -05:00
mem_domain.c kernel: Make statements evaluate boolean expressions 2019-01-07 08:52:07 -05:00
mem_slab.c kernel: Add 'U' to unsigned variable assignments 2018-12-04 22:51:56 -05:00
mempool.c sys_clock: Fix unsafe tick count usage 2018-10-16 15:03:10 -04:00
msg_q.c kernel: Add missing include 2019-01-11 15:18:52 -05:00
mutex.c kernel: mutex: delay setting lock_count = 0. 2018-12-05 11:00:10 +01:00
pipes.c kernel: Add missing include 2019-01-11 15:18:52 -05:00
poll.c kernel: Fix asynchronous event polling interface 2019-01-09 17:06:08 -05:00
queue.c kernel: Add missing include 2019-01-11 15:18:52 -05:00
sched.c kernel/sched: SWAP_NONATOMIC workaround for timeslicing 2019-01-15 13:06:35 +01:00
sem.c kernel: sem: Fix few MISRA C violations. 2018-10-17 12:17:58 -04:00
smp.c kernel; Checking functions return 2018-09-14 16:55:37 -04:00
stack.c kernel: Add missing include 2019-01-11 15:18:52 -05:00
system_work_q.c kernel: system_work_q: Set dedicated "sysworkq" name. 2018-10-19 07:58:45 -04:00
thread.c kernel: Change k_is_in_isr to return bool 2019-01-07 08:52:07 -05:00
thread_abort.c kernel: Using boolean expression on ASSERT macros 2018-09-28 06:28:41 +05:30
timeout.c kernel/timeout: Fix recursive spinlock in z_set_timeout_expiry() 2019-01-18 06:48:51 -05:00
timer.c kernel: Make statements evaluate boolean expressions 2019-01-07 08:52:07 -05:00
userspace.c kernel: Make statements evaluate boolean expressions 2019-01-07 08:52:07 -05:00
userspace_handler.c kernel: Make statements evaluate boolean expressions 2019-01-07 08:52:07 -05:00
version.c doc: add kernel version API to doxygen 2018-12-08 17:24:53 -05:00
work_q.c kernel: Use NULL instead of 0 2018-12-11 14:37:10 -08:00