diff --git a/headers/private/kernel/cpu.h b/headers/private/kernel/cpu.h index a864d5fb16..df00acca2b 100644 --- a/headers/private/kernel/cpu.h +++ b/headers/private/kernel/cpu.h @@ -50,8 +50,9 @@ typedef struct cpu_topology_node { typedef struct CACHE_LINE_ALIGN cpu_ent { int cpu_num; + bool disabled; - // thread.c: used to force a reschedule at quantum expiration time + // used to force a reschedule at quantum expiration time bool preempted; timer quantum_timer; @@ -72,8 +73,7 @@ typedef struct CACHE_LINE_ALIGN cpu_ent { Thread* running_thread; Thread* previous_thread; - bool invoke_scheduler; - bool disabled; + int32 invoke_scheduler; // CPU topology information int topology_id[CPU_TOPOLOGY_LEVELS]; diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index 0a4574c1aa..036e06075a 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -134,7 +134,7 @@ enqueue(Thread* thread, bool newOne) if (targetCPU->ID() == smp_get_current_cpu()) { gCPU[targetCPU->ID()].invoke_scheduler = true; - } else { + } else if (atomic_get_and_set(&gCPU[targetCPU->ID()].invoke_scheduler, true) != true) { smp_send_ici(targetCPU->ID(), SMP_MSG_RESCHEDULE, 0, 0, 0, NULL, SMP_MSG_FLAG_ASYNC); } @@ -321,7 +321,7 @@ reschedule(int32 nextState) SCHEDULER_ENTER_FUNCTION(); int32 thisCPU = smp_get_current_cpu(); - gCPU[thisCPU].invoke_scheduler = false; + atomic_set(&gCPU[thisCPU].invoke_scheduler, false); CPUEntry* cpu = CPUEntry::GetCPU(thisCPU); CoreEntry* core = CoreEntry::GetCore(thisCPU);