Skip to content

Conversation

@vivek1-j
Copy link
Contributor

@vivek1-j vivek1-j commented Nov 26, 2025

   *Add sched_cpuon and sched_cpuoff API to Scheduler.
   *Only one CPU can turn another CPU OFF/ON at a time, the operations are guarded by spinlock.
   *sched_cpuon: Turns previously off CPU (1 ... N) to on.
          *CPU cannot turn itself on.
          *CPU number must be valid between (1 ... CONFIG_SMP_NCPUS).
          *CPU 0 cannot be turned ON.
   *sched_cpuoff: Turns previously on CPU (1 ... N) to off, after migrating tasks to other CPUs.
          *CPU cannot turn itsef OFF.
          *CPU number must be valid between (1 ... CONFIG_SMP_NCPUS).
          *When task migration is not requested, then CPU must be running only IDLE task.
   *Given functionality is only available when config SMP is ON.
   *The following configurations must be turned on CONFIG_CPU_MANAGER and CONFIG_SCHED_MIGRATE

Test Results

TASH>>cputest
TASH>>Main[0]: Running on CPU0
Scheduler API Test Application

=== Creating Worker Threads ===
Running with AMP configuration
Thread[1]: Started
Thread[1]: Running on CPU0
Thread 1 created
Thread[2]: Started
Thread[2]: Running on CPU1
Thread 2 created
Thread[3]: Started
Thread[3]: Running on CPU0
Thread 3 created
Thread[4]: Started
Thread[4]: Running on CPU1
Thread 4 created
Thread[5]: Started
Thread[5]: Running on CPU0
Thread 5 created
Thread[6]: Started
Thread[6]: Running on CPU1
Thread 6 created
Thread[7]: Started
Thread[7]: Running on CPU0
Thread 7 created
Thread[8]: Started
Thread[8]: Running on CPU1
Thread 8 created

=== Testing Invalid Parameters ===
Test 1: Attempting to turn off CPU 0 (should fail)
SUCCESS: sched_cpuoff(0) correctly failed with ret=-22
Test 2: Attempting to turn on CPU 0 (should fail)
SUCCESS: sched_cpuon(0) correctly failed with ret=-22
Test 3: Attempting to turn off invalid CPU number (should fail)
SUCCESS: sched_cpuoff(invalid_cpu) correctly failed with ret=-22
Test 4: Attempting to turn on invalid CPU number (should fail)
SUCCESS: sched_cpuon(invalid_cpu) correctly failed with ret=-22
Test 5: Attempting to turn off negative CPU number (should fail)
SUCCESS: sched_cpuoff(-1) correctly failed with ret=-22
Test 6: Attempting to turn on negative CPU number (should fail)
SUCCESS: sched_cpuon(-1) correctly failed with ret=-22
=== Invalid Parameter Tests Completed Successfully ===

=== CPU Hotplug Test ===
Testing CPU 1 hotplug for 100 iterations
Iteration 1: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 1: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 1: Completed
Iteration 2: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 2: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 2: Completed
Iteration 3: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 3: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 3: Completed
Iteration 4: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 4: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 4: Completed
Iteration 5: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 5: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 5: Completed
Iteration 6: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 6: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 6: Completed
Iteration 7: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 7: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 7: Completed
Iteration 8: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 8: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 8: Completed
Iteration 9: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 9: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 9: Completed
Iteration 10: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 10: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 10: Completed
Iteration 11: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 11: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 11: Completed
Iteration 12: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 12: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 12: Completed
Iteration 13: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 13: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 13: Completed
Iteration 14: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 14: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 14: Completed
Iteration 15: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 15: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 15: Completed
Iteration 16: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 16: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 16: Completed
Iteration 17: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 17: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 17: Completed
Iteration 18: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 18: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 18: Completed
Iteration 19: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 19: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 19: Completed
Iteration 20: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 20: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 20: Completed
Iteration 21: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 21: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 21: Completed
Iteration 22: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 22: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 22: Completed
Iteration 23: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 23: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 23: Completed
Iteration 24: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 24: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 24: Completed
Iteration 25: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 25: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 25: Completed
Iteration 26: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 26: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 26: Completed
Iteration 27: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 27: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 27: Completed
Iteration 28: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 28: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 28: Completed
Iteration 29: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 29: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 29: Completed
Iteration 30: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 30: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 30: Completed
Iteration 31: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 31: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 31: Completed
Iteration 32: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 32: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 32: Completed
Iteration 33: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 33: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 33: Completed
Iteration 34: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 34: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 34: Completed
Iteration 35: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 35: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 35: Completed
Iteration 36: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 36: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 36: Completed
Iteration 37: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 37: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 37: Completed
Iteration 38: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 38: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 38: Completed
Iteration 39: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 39: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 39: Completed
Iteration 40: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 40: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 40: Completed
Iteration 41: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 41: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 41: Completed
Iteration 42: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 42: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 42: Completed
Iteration 43: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 43: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 43: Completed
Iteration 44: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 44: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 44: Completed
Iteration 45: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 45: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 45: Completed
Iteration 46: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 46: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 46: Completed
Iteration 47: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 47: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 47: Completed
Iteration 48: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 48: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 48: Completed
Iteration 49: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 49: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 49: Completed
Iteration 50: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 50: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 50: Completed
Iteration 51: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 51: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 51: Completed
Iteration 52: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 52: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 52: Completed
Iteration 53: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 53: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 53: Completed
Iteration 54: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 54: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 54: Completed
Iteration 55: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 55: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 55: Completed
Iteration 56: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 56: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 56: Completed
Iteration 57: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 57: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 57: Completed
Iteration 58: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 58: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 58: Completed
Iteration 59: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 59: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 59: Completed
Iteration 60: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 60: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 60: Completed
Iteration 61: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 61: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 61: Completed
Iteration 62: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 62: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 62: Completed
Iteration 63: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 63: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 63: Completed
Iteration 64: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 64: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 64: Completed
Iteration 65: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 65: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 65: Completed
Iteration 66: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 66: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 66: Completed
Iteration 67: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 67: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 67: Completed
Iteration 68: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 68: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 68: Completed
Iteration 69: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 69: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 69: Completed
Iteration 70: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 70: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 70: Completed
Iteration 71: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 71: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 71: Completed
Iteration 72: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 72: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 72: Completed
Iteration 73: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 73: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 73: Completed
Iteration 74: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 74: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 74: Completed
Iteration 75: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 75: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 75: Completed
Iteration 76: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 76: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 76: Completed
Iteration 77: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 77: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 77: Completed
Iteration 78: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 78: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 78: Completed
Iteration 79: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 79: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 79: Completed
Iteration 80: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 80: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 80: Completed
Iteration 81: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 81: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 81: Completed
Iteration 82: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 82: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 82: Completed
Iteration 83: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 83: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 83: Completed
Iteration 84: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 84: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 84: Completed
Iteration 85: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 85: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 85: Completed
Iteration 86: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 86: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 86: Completed
Iteration 87: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 87: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 87: Completed
Iteration 88: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 88: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 88: Completed
Iteration 89: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 89: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 89: Completed
Iteration 90: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 90: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 90: Completed
Iteration 91: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 91: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 91: Completed
Iteration 92: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 92: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 92: Completed
Iteration 93: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 93: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 93: Completed
Iteration 94: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 94: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 94: Completed
Iteration 95: Turning off CPU 1
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Iteration 95: Turning on CPU 1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Iteration 95: Completed
Iteration 96: Turning off CPU 1
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Iteration 96: Turning on CPU 1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 96: Completed
Iteration 97: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 97: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 97: Completed
Iteration 98: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 98: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[8]: Now running on CPU1
Iteration 98: Completed
Iteration 99: Turning off CPU 1
Thread[4]: Now running on CPU0
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Iteration 99: Turning on CPU 1
Thread[2]: Now running on CPU1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Iteration 99: Completed
Iteration 100: Turning off CPU 1
Thread[2]: Now running on CPU0
Thread[6]: Now running on CPU0
Thread[8]: Now running on CPU0
Thread[4]: Now running on CPU0
Iteration 100: Turning on CPU 1
Thread[6]: Now running on CPU1
Thread[8]: Now running on CPU1
Thread[4]: Now running on CPU1
Thread[2]: Now running on CPU1
Iteration 100: Completed
=== CPU Hotplug Test Completed Successfully ===

=== Cleaning up threads ===
Thread[1]: Done
Thread[4]: Done
Thread[2]: Done
Thread[6]: Done
Thread[8]: Done
Thread[7]: Done
Thread[3]: Done
Thread[5]: Done
=== Test Completed Successfully ===

Signed-Off By: Vivek Jain (vivek1.j@samsung.com)

@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch from 7648a32 to 53045b0 Compare November 26, 2025 12:13
Comment on lines 115 to 116
if(CPU_ISSET(cpu, &g_active_cpus_mask)) {
//check migrate flag migrate all task off of CPU if set.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please move CPU_CLR(cpu, &g_active_cpus_mask) here from sched_migrate_tasks?

same location of CLR and SET is better.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, I'll include this in sched_cpuoff.c and remove it from sched_migrate_tasks.c

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is done and changes pushed to branch.

/* Lock the scheduler and disable interrupts to ensure atomicity
* throughout this critical operation.
*/
flags = enter_critical_section();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some section is protecting using spin_lock
and here, it's protected using enter_critical_section.

Could you please let me know what is difference??

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

spin_lock is used to ensure only one CPU is performing turn OFF/ON operation at time.
enter_critical_section ensures the CPU which is executing code doesn't get interrupted while actually performing the requested operation.

Comment on lines 93 to 98
if(spin_trylock(&g_cpuhp_lock[cpu]) == SP_LOCKED) {
slldbg("CPU state change is already in progress\n");
return -EBUSY;
}

spin_lock(&g_state_transition_lock);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please check below case?

CPU0 - call sched_cpuoff(1) - sched_cpuon(1) repeated.
CPU1 - call enter_critical_section() - up_cpu_pause(0) - up_cpu_resume(0) - leave_critical_section() in IRQ repeated.

Please check if spin_lock is enough and if we need masking IRQ

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have done this testing it works well, after modifying code according to review comments, I'll run test again and update PR description with results.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


int sched_cpuon(int cpu)
{
if(spin_trylock(&g_cpuhp_lock[cpu]) == SP_LOCKED) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

}

if(!CPU_ISSET(cpu,&g_active_cpus_mask)) {
ret = up_cpu_on(cpu);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move it also into critical_section.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment on lines 93 to 98
if(spin_trylock(&g_cpuhp_lock[cpu]) == SP_LOCKED) {
slldbg("CPU state change is already in progress\n");
return -EBUSY;
}

spin_lock(&g_state_transition_lock);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please check below also.

if we have 4core,

  • cpu1 call cpuoff(2) in IRQ
  • cpu2 call cpuoff(1) in IRQ
    it looks deadlock..

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have now moved to single spin_lock to ensure only one CPU performs the operation at a time.

int sched_cpuoff(int cpu, bool migrate)
{
if(spin_trylock(&g_cpuhp_lock[cpu]) == SP_LOCKED) {
slldbg("CPU state change is already in progress\n");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vivek1-j @ewoodev Where will you call this function? lldbg is ok? Is this for ISR?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it will be called in idle thread.

lldbg is better for debugging.
but we won't not enable default

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ewoodev I don't get why lldbg is better in the idle. Could you elaborate more?

if (cpu == this_cpu()) {
slldbg("Cannot turn off this CPU from itself: %d\n", cpu);
ret = -EINVAL;
goto errout_with_global_lock;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you need to lock them before input validations?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validation order is changed

@sunghan-chang
Copy link
Contributor

   *Add sched_cpuon and sched_cpuoff API to Scheduler
   *sched_cpuon: Turns previously off CPU (1 ... N) to on.
   *sched_cpuoff: Turns previously on CPU (1 ... N) to off, after migrating tasks to other CPUs.

Signed-Off By: Vivek Jain (vivek1.j@samsung.com)

Is there any limitation on usages? Could you elaborate them more?

@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch 2 times, most recently from c06411c to 2106089 Compare December 2, 2025 06:38
}
}
//Call up_cpu_off function
flags = enter_critical_section();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sched_migrate_tasks is also using enter_critical_section.

How about include it also.?

i mean

flags = enter_critical_section();
CPU_CLR(cpu, &g_active_cpus_mask);
// leave_critical_section(flags); <--------remove
ret = sched_migrate_tasks(cpu);
// flags = enter_critical_section(); <--------remove
ret = up_cpu_off(cpu);
leave_critical_section(flags);

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sched_migrate_tasks is also using enter_critical_section.

How about include it also.?

i mean

flags = enter_critical_section();
CPU_CLR(cpu, &g_active_cpus_mask);
// leave_critical_section(flags); <--------remove
ret = sched_migrate_tasks(cpu);
// flags = enter_critical_section(); <--------remove
ret = up_cpu_off(cpu);
leave_critical_section(flags);

Done

@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch from 2106089 to 3ad9d39 Compare December 4, 2025 05:38
*
****************************************************************************/

int sched_cpuoff(int cpu, bool migrate)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't need to seperate not migration case.

up_cpu_off api is needed idle state.
it means, we need to do migrate task everycase.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We always leave idle task in CPU's assigned list, which means when CPU is running only idle task then there is no need of calling task migration.

I'll modify code like this:
FAR struct tcb_s *tcb; tcb = current_task(cpu); bool migrate = (tcb->pid != cpu);
before taking lock and remove the flag from function parameter.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is done.

* Request to bring a CPU to power off state.
*
* Input Parameters:
* cpu - The CPU index to turn of
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

of -> off

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, done

@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch 3 times, most recently from 2fdcd29 to 0bc6567 Compare December 8, 2025 07:18
Comment on lines 101 to 110
FAR struct tcb_s *tcb;
tcb = current_task(cpu);
bool migrate = (tcb->pid != cpu);

if (spin_trylock(&g_state_transition_lock) == SP_LOCKED) {
return -EBUSY;
}

irqstate_t flags;
int ret = OK;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor,
Could you please move variable declaration to the top of the function.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code will be removed from this PR, according to discussion.

@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch 3 times, most recently from 8cba618 to d7f04b7 Compare December 15, 2025 07:26
    This commit is to move CPU mask clearing code from sched_migrate_tasks.c to sched_cpuoff.c
    This is done to keep the functionality at common place.

Signed-Off By: Vivek Jain (vivek1.j@samsung.com)
@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch from d7f04b7 to d1a1c47 Compare December 17, 2025 12:26
ret = sched_migrate_tasks(cpu);
if (ret != 0) {
leave_critical_section(flags);
goto errout_with_global_lock;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we have to restore g_active_cpus_mask in migration fail case.
CPU_SET(cpu, &g_active_cpus_mask);

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code will be removed from this PR according to latest discussion.

Comment on lines 128 to 141
//check migrate flag migrate all task off of CPU if set.
if (migrate) {
ret = sched_migrate_tasks(cpu);
if (ret != 0) {
leave_critical_section(flags);
goto errout_with_global_lock;
}
//since we have migrated the tasks, we need to consider leaving critical section
//this is required because task migration required to pause CPU.
//the interrupt will not return until we leave critical section.
//this will prevent cpu off operation to complete successfully.
leave_critical_section(flags);
flags = enter_critical_section();
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As our disscussion, Please remove this code in this PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment on lines 342 to 349
config CPU_MANAGER
bool "CPU Manager"
default n
---help---
Enable the CPU Manager module which provides a centralized
interface for handling CPU on and off operations both from user
applications (via CPU driver) and from the PM idle logic.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

config CPU_HOTPLUG
	bool "CPU Hotplug"
	default n
	depends on PM
	---help---
		This will register an additional Software Generated Interrupt (SGI) 
		for CPU Hotplug when system goes low power mode (ie. Power Gating)

we have already config for cpu on/off. How about merge to it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, using CPU_HOTPLUG now

       *Add sched_cpuon and sched_cpuoff API to Scheduler
       *sched_cpuon: Turns previously off CPU (1 ... N) to on.
       *sched_cpuoff: Turns previously on CPU (1 ... N) to off, after migrating tasks to other CPUs.

  Signed-Off By: Vivek Jain (vivek1.j@samsung.com)
@vivek1-j vivek1-j force-pushed the cpu_on_off_sched_api branch from d1a1c47 to 9f14032 Compare December 18, 2025 08:44
@ewoodev ewoodev merged commit 5fddb5b into Samsung:master Dec 18, 2025
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants