From 5e72d81a8f6051871e40f944167b1d964c2e1332 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 25 Feb 2023 03:58:11 +0200 Subject: [PATCH] Simple CPU affinity system --- Tasking/Scheduler.cpp | 12 ++++++++++++ Tasking/Task.cpp | 8 +++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Tasking/Scheduler.cpp b/Tasking/Scheduler.cpp index aa25071..c081185 100644 --- a/Tasking/Scheduler.cpp +++ b/Tasking/Scheduler.cpp @@ -140,6 +140,9 @@ namespace Tasking if (tcb->Status != TaskStatus::Ready) continue; + if (tcb->Info.Affinity[CurrentCPU->ID] == false) + continue; + CurrentCPU->CurrentProcess = pcb; CurrentCPU->CurrentThread = tcb; return true; @@ -178,6 +181,9 @@ namespace Tasking goto RetryAnotherThread; } + if (thread->Info.Affinity[CurrentCPU->ID] == false) + continue; + CurrentCPU->CurrentThread = thread; gnat_schedbg("[thd 0 -> end] Scheduling thread %d parent of %s->%d Procs %d", thread->ID, thread->Parent->Name, CurrentCPU->CurrentProcess->Threads.size(), ListProcess.size()); return true; @@ -238,6 +244,9 @@ namespace Tasking continue; } + if (tcb->Info.Affinity[CurrentCPU->ID] == false) + continue; + CurrentCPU->CurrentProcess = pcb; CurrentCPU->CurrentThread = tcb; gnap_schedbg("[cur proc+1 -> first thd] Scheduling thread %d %s->%d (Total Procs %d)", tcb->ID, tcb->Name, pcb->Threads.size(), ListProcess.size()); @@ -290,6 +299,9 @@ namespace Tasking continue; } + if (tcb->Info.Affinity[CurrentCPU->ID] == false) + continue; + CurrentCPU->CurrentProcess = pcb; CurrentCPU->CurrentThread = tcb; sspt_schedbg("[proc 0 -> end -> first thd] Scheduling thread %d parent of %s->%d (Procs %d)", tcb->ID, tcb->Parent->Name, pcb->Threads.size(), ListProcess.size()); diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index eab9c7a..5b93370 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -741,8 +741,8 @@ namespace Tasking { SmartCriticalSection(TaskingLock); #if defined(__amd64__) - for (int i = 0; i < SMP::CPUCores; i++) - ((APIC::APIC *)Interrupts::apic[i])->RedirectIRQ(i, CPU::x86::IRQ16 - CPU::x86::IRQ0, 1); + // Map the IRQ16 to the first CPU. + ((APIC::APIC *)Interrupts::apic[0])->RedirectIRQ(0, CPU::x86::IRQ16 - CPU::x86::IRQ0, 1); #elif defined(__i386__) #elif defined(__aarch64__) #endif @@ -812,7 +812,9 @@ namespace Tasking sprintf(IdleName, "Idle Thread %d", i); IdleThread->Rename(IdleName); IdleThread->SetPriority(Idle); - break; + for (int j = 0; j < MAX_CPU; j++) + IdleThread->Info.Affinity[j] = false; + IdleThread->Info.Affinity[i] = true; } debug("Tasking Started"); #if defined(__amd64__)