Commit 535fc38f authored by Wolfgang Reißnegger's avatar Wolfgang Reißnegger Committed by Anas Nashif
Browse files

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: default avatarWolfgang Reißnegger <gnagflow@fb.com>
parent 164029b0
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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