zephyr/kernel
Andy Ross 722aeead91 kernel/sched: Nonatomic swap workaround update for qemu behavior
The workaround for nonatomic swap had yet another edge case: it would
save off the _current pointer when pending a thread so that the next
time slice interrupt could test it to see if the swap had actually
happened before assuming that _current could be rescheduled (if it
just pended itself, that's impossible).  Then it would clear the
pending_current pointer so future interrupts wouldn't be confused.

BUT: it turns out that qemu, when faced with really rapid timer rates
that exceed its (host-based) timing accuracy, is perfectly willing to
"stack up" timer interrupts such the one goes pending before the
previous one is finished executing.  In that case, we can enter the
SECOND timer interrupt, to try timeslicing a SECOND time, STILL before
the PendSV exception has run to actually effect the context switch.
Except this time pending_current has been cleared and we try to
reschedule the pended _current thread incorrectly.  In theory real
hardware could do this too, though it would involve absolutely crazy
interrupt latency problems.

Work around this by moving the clear to the thread itself, immediately
after it wakes up from the pend call it retakes a lock and clears
pending_current if it still matches _current.  That is not a perfect
fix: there remains a 2-3 instruction race at that moment where we
return from pend and before we can lock interrupts again where a timer
interrupt will see an incorrect pointer.  But I hammered at this and
couldn't make qemu do that (i.e. return from a timer interrupt but
flag a new one in just a cycle or two).

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2019-03-15 05:50:43 +01:00
..
include kernel: userspace: correct documentation for Z_SYSCALL_MEMORY_ macros 2019-03-13 15:36:15 -07:00
atomic_c.c
CMakeLists.txt
compiler_stack_protect.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
device.c device: Extend device_set_power_state API to support async requests 2019-03-14 14:26:15 +01:00
errno.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
idle.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
init.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
int_latency_bench.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
Kconfig kernel/sched: arch/x86_64: Support synchronous k_thread_abort() in SMP 2019-03-13 19:15:20 +01:00
Kconfig.power_mgmt
mailbox.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
mem_domain.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
mem_slab.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
mempool.c kernel: Make heap smallest object size configurable 2019-03-12 11:56:31 +01:00
msg_q.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
mutex.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
pipes.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
poll.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
queue.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
sched.c kernel/sched: Nonatomic swap workaround update for qemu behavior 2019-03-15 05:50:43 +01:00
sem.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
smp.c kernel/sched: arch/x86_64: Support synchronous k_thread_abort() in SMP 2019-03-13 19:15:20 +01:00
stack.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
system_work_q.c
thread_abort.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
thread.c kernel/spinlock: Fix race in spinlock validation 2019-03-13 19:15:20 +01:00
timeout.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
timer.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
userspace_handler.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
userspace.c all: Update reserved function names 2019-03-11 13:48:42 -04:00
version.c
work_q.c kernel/work_q: Fix locking across multiple queues 2019-03-12 18:37:41 +01:00