The "null out the switch handle and put it back" code in the swap implementation is a holdover from some defensive coding (not wanting to break the case where we picked our current thread), but it hides a subtle SMP race: when that field goes NULL, another CPU that may have selected that thread (which is to say, our current thread) as its next to run will be spinning on that to detect when the field goes non-NULL. So it will get the signal to move on when we revert the value, when clearly we are still running on the stack! In practice this was found on x86 which poisons the switch context such that it crashes instantly. Instead, be firm about state and always set the switch handle of a currently running thread to NULL immediately before it starts running: right before entering arch_switch() and symmetrically on the interrupt exit path. Fixes #28105 Signed-off-by: Andy Ross <andrew.j.ross@intel.com> |
||
|---|---|---|
| .. | ||
| gen_offset.h | ||
| kernel_arch_interface.h | ||
| kernel_internal.h | ||
| kernel_offsets.h | ||
| kernel_tls.h | ||
| ksched.h | ||
| kswap.h | ||
| mmu.h | ||
| offsets_short.h | ||