Commit Diff


commit - 68d2febf4860768d02aaa134cfcac0fa3ee35508
commit + 836647ae0821cc54f898ee48617f06de87d6a654
blob - 38c0ad2754ae80a4a1dd4adba133b9acecc02196
blob + 29e1953aad0e1d7866a4c0f8bf9b70280a272e97
--- kernel/sched/task.c
+++ kernel/sched/task.c
@@ -661,8 +661,6 @@ void
 sched_tick(void)
 {
 	struct sched_cpu_state *state;
-	struct sched_task *task;
-	bool requeue;
 
 	if (!scheduler_started)
 		return;
@@ -673,15 +671,10 @@ sched_tick(void)
 	state->tick_count++;
 	if (state->run_length > state->max_run_length)
 		state->max_run_length = state->run_length;
-	task = state->current;
-	requeue = task != NULL && !task->is_idle;
-	if (state->need_resched) {
-		state->need_resched = false;
-		requeue = true;
-	}
+	/* Set need_resched to trigger a context switch at a safe point */
+	state->need_resched = true;
 	/* Check for portal_recv timeouts (deadlock detection) */
 	deadlock_check_and_report();
-	sched_switch(requeue);
 }
 
 void
blob - b589bbf3dfa668ad1860308d684d604e95eb8632
blob + f66a1c51bd3c85d97b594ba61a2769d5e365e88e
--- kernel/time/time.c
+++ kernel/time/time.c
@@ -6,6 +6,7 @@
 
 #include "time/timer.h"
 #include "sched/clock.h"
+#include "sched/task.h"
 #include "mm/kmem.h"
 #include "log/printk.h"
 #include "log/serial.h"
@@ -116,6 +117,7 @@ timer_handle_tick(void)
 	serial_poll_rx();
 	timer_tick_count++;
 	sched_clock_tick(timer_tick_count);
+	sched_tick();
 
 	/* Timer discipline: detect drift and vector storms */
 	if (timer_last_tick_time != 0) {