22#include "sched.h"
33#include "secure_caps.h"
44#include "signal.h"
5+ #include "smp_rally.h"
56#include "timer.h"
67#include "types.h"
78#include "vm_space.h"
@@ -101,10 +102,11 @@ static void list_append(process_t* proc) {
101102static void enqueue_task (process_t * proc ) {
102103 uint32_t best_cpu = 0 ;
103104 uint32_t min_count = 0xFFFFFFFF ;
105+ uint32_t online = smp_rally_online_mask ();
104106
105- // Find best CPU
107+ // Find best CPU among online ones in mask
106108 for (uint32_t i = 0 ; i < MAX_CPUS ; i ++ ) {
107- if ((proc -> cpu_mask & (1 << i )) && runqueues [i ].count < min_count ) {
109+ if ((online & ( 1 << i )) && ( proc -> cpu_mask & (1 << i )) && runqueues [i ].count < min_count ) {
108110 min_count = runqueues [i ].count ;
109111 best_cpu = i ;
110112 }
@@ -288,7 +290,7 @@ static process_t* process_create_ex(void (*entry)(void), uint32_t* page_director
288290 proc -> time_slice = default_time_slice ;
289291 proc -> time_remaining = default_time_slice ;
290292 proc -> sched_class = SCHED_CLASS_CFS ;
291- proc -> cpu_mask = 1 ;
293+ proc -> cpu_mask = 0xFFFFFFFF ;
292294 proc -> cgroup_share = 1024 ;
293295
294296 proc -> parent_pid = proc -> pid ;
@@ -513,9 +515,10 @@ void scheduler_balance_load(void) {
513515
514516 uint32_t busiest_cpu = this_cpu ;
515517 uint32_t max_count = 0 ;
518+ uint32_t online = smp_rally_online_mask ();
516519
517520 for (uint32_t i = 0 ; i < MAX_CPUS ; i ++ ) {
518- if (runqueues [i ].count > max_count ) {
521+ if (( online & ( 1 << i )) && runqueues [i ].count > max_count ) {
519522 max_count = runqueues [i ].count ;
520523 busiest_cpu = i ;
521524 }
@@ -692,7 +695,7 @@ process_t* switch_task(registers_t* saved_stack, process_t** previous) {
692695 int switch_needed = 0 ;
693696 if (best ) {
694697 // Priority class overrides
695- if (best -> sched_class < current -> sched_class ) switch_needed = 1 ;
698+ if (best -> sched_class > current -> sched_class ) switch_needed = 1 ;
696699 else if (best -> sched_class == current -> sched_class ) {
697700 if (best -> sched_class == SCHED_CLASS_RT && best_prio > current_prio ) switch_needed = 1 ;
698701 else if (best -> sched_class == SCHED_CLASS_CFS && best -> vruntime < current -> vruntime ) switch_needed = 1 ;
@@ -967,6 +970,7 @@ void process_exit(process_t* proc, uint32_t code) {
967970 process_t * next = p -> wait_next ;
968971 p -> wait_next = 0 ;
969972 p -> state = PROCESS_READY ;
973+ enqueue_task (p );
970974 p = next ;
971975 }
972976 queue -> head = 0 ;
@@ -1098,6 +1102,8 @@ process_t* wait_queue_wake_one(wait_queue_t* queue) {
10981102
10991103 proc -> wait_next = 0 ;
11001104 proc -> state = PROCESS_READY ;
1105+ enqueue_task (proc );
1106+
11011107 spin_unlock (& sched_lock );
11021108 return proc ;
11031109}
@@ -1115,6 +1121,7 @@ uint32_t wait_queue_wake_all(wait_queue_t* queue) {
11151121 process_t * next = proc -> wait_next ;
11161122 proc -> wait_next = 0 ;
11171123 proc -> state = PROCESS_READY ;
1124+ enqueue_task (proc );
11181125 proc = next ;
11191126 count ++ ;
11201127 }
0 commit comments