diff --git a/src/system/kernel/scheduler/power_saving.cpp b/src/system/kernel/scheduler/power_saving.cpp index 4ebd746d37..c9c28bd25d 100644 --- a/src/system/kernel/scheduler/power_saving.cpp +++ b/src/system/kernel/scheduler/power_saving.cpp @@ -196,9 +196,16 @@ pack_irqs() return; cpu_ent* cpu = get_cpu_struct(); - if (smallTaskCore == CoreEntry::GetCore(cpu->cpu_num)) + CoreEntry* thisCore = CoreEntry::GetCore(cpu->cpu_num); + if (smallTaskCore == thisCore) return; + // Avoid packing IRQs if it's not really going to change much. + if (thisCore->GetLoad() >= smallTaskCore->GetLoad() + || (smallTaskCore->GetLoad() - thisCore->GetLoad()) < kLoadDifference) { + return; + } + SpinLocker locker(cpu->irqs_lock); while (list_get_first_item(&cpu->irqs) != NULL) { irq_assignment* irq = (irq_assignment*)list_get_first_item(&cpu->irqs);