riscv: Don't reschedule on back-to-back interrupts

In some cases the 'reschedule' code path is executed when the current
thread is the same as the next thread in the ready Q. If this happens,
the swap_return_value of the thread is ifalsely being reset to -EAGAIN.

This commit prevents the rescheduling code to run if the current thread
is the same as the thread in the ready Q.

Signed-off-by: Wolfgang Reißnegger <gnagflow@fb.com>
This commit is contained in:
Wolfgang Reißnegger 2021-05-24 14:36:28 -07:00 committed by Anas Nashif
parent 164029b0c5
commit 535fc38fe7

View file

@ -811,6 +811,18 @@ skip_fp_move_irq:
#endif /* CONFIG_USERSPACE */
reschedule:
/*
* Check if the current thread is the same as the thread on the ready Q. If
* so, do not reschedule.
* Note:
* Sometimes this code is execute back-to-back before the target thread
* has a chance to run. If this happens, the current thread and the
* target thread will be the same.
*/
la t0, _kernel
RV_OP_LOADREG t2, _kernel_offset_to_current(t0)
RV_OP_LOADREG t3, _kernel_offset_to_ready_q_cache(t0)
beq t2, t3, no_reschedule
#if CONFIG_INSTRUMENT_THREAD_SWITCHING
call z_thread_mark_switched_out