From 163053a45c7e0094777525af8d24aea0eadfc32f Mon Sep 17 00:00:00 2001 From: Puck Meerburg Date: Wed, 27 Sep 2023 23:23:01 +0000 Subject: [PATCH] scheduler: Only unassign a thread's core if it is not pinned If a pinned thread is being run while disabling a CPU core, the thread is properly requeued to that core, but with fCore set to NULL, causing the scheduler to panic the next time that thread is rescheduled. Change-Id: I9cf18c5a470517124b2573347cf3eb6fd26ab7b6 Reviewed-on: https://review.haiku-os.org/c/haiku/+/6917 Tested-by: Commit checker robot Reviewed-by: waddlesplash --- src/system/kernel/scheduler/scheduler.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/scheduler/scheduler.cpp b/src/system/kernel/scheduler/scheduler.cpp index 1913e57b35..6a3a7ec91b 100644 --- a/src/system/kernel/scheduler/scheduler.cpp +++ b/src/system/kernel/scheduler/scheduler.cpp @@ -381,8 +381,12 @@ reschedule(int32 nextState) ThreadData* nextThreadData; if (gCPU[thisCPU].disabled) { if (!oldThreadData->IsIdle()) { - putOldThreadAtBack = oldThread->pinned_to_cpu == 0; - oldThreadData->UnassignCore(true); + if (oldThread->pinned_to_cpu == 0) { + putOldThreadAtBack = true; + oldThreadData->UnassignCore(true); + } else { + putOldThreadAtBack = false; + } CPURunQueueLocker cpuLocker(cpu); nextThreadData = cpu->PeekIdleThread();