evl/thread: fix leaking ready state in evl_switch_inband()
When arming T_INBAND for the stage switching thread, we have to remove
it from the runqueue in the same move if T_READY is present in its
state flags.
Failing to do so creates a race with another CPU readying that thread
by calling evl_release_thread(), which leads to an inconsistent
scheduler state with both T_INBAND and T_READY set for the
thread. When this happens, evl_switch_inband() may pick the switching
thread from the runqueue for out-of-band scheduling in
__evl_schedule() despite being formally blocked by T_INBAND, instead
of waiting for the inband scheduler to do so for completing the
transition to inband context.
As a result, dovetail_resume_inband() spuriously runs from the
out-of-band stage eventually (caught by CONFIG_DEBUG_DOVETAIL), which
leads to a galactic mess.
Signed-off-by:
Philippe Gerum <rpm@xenomai.org>
Please register or sign in to comment