diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2011-05-24 22:01:46 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-05-26 10:40:30 -0500 |
commit | 97399f8e048f3fe76bc9fe179546990b8ba54562 (patch) | |
tree | 6491efcd31e67ef6f4670659965cbc75a04ccd9b /src/kernel/scheduler.C | |
parent | 90d4e5df06e6108f846013a48b996e936adeffec (diff) | |
download | talos-hostboot-97399f8e048f3fe76bc9fe179546990b8ba54562.tar.gz talos-hostboot-97399f8e048f3fe76bc9fe179546990b8ba54562.zip |
Kernel support for processor affinity.
Change-Id: Ie84a805bad58032085208a98b1b31393def681cb
Reviewed-on: http://gfwr801.rchland.ibm.com:8080/gerrit/100
Tested-by: Jenkins Server
Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com>
Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com>
Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com>
Diffstat (limited to 'src/kernel/scheduler.C')
-rw-r--r-- | src/kernel/scheduler.C | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/src/kernel/scheduler.C b/src/kernel/scheduler.C index cb3cb5e95..ef0c3c005 100644 --- a/src/kernel/scheduler.C +++ b/src/kernel/scheduler.C @@ -10,7 +10,22 @@ void Scheduler::addTask(task_t* t) { if (t->cpu->idle_task != t) { - iv_taskList.insert(t); + // If task is pinned to this CPU, add to the per-CPU queue. + if (0 != t->affinity_pinned) + { + // Allocate a per-CPU queue if this is the first pinning CPU. + if (NULL == t->cpu->scheduler_extra) + { + t->cpu->scheduler_extra = new Runqueue_t(); + } + // Insert into queue. + static_cast<Runqueue_t*>(t->cpu->scheduler_extra)->insert(t); + } + // Not pinned, add to global run-queue. + else + { + iv_taskList.insert(t); + } } } @@ -21,11 +36,25 @@ void Scheduler::returnRunnable() void Scheduler::setNextRunnable() { - task_t* t = iv_taskList.remove(); + task_t* t = NULL; + cpu_t* cpu = CpuManager::getCurrentCPU(); + + // Check for ready task in local run-queue, if it exists. + if (NULL != cpu->scheduler_extra) + { + t = static_cast<Runqueue_t*>(cpu->scheduler_extra)->remove(); + } + + // Check for ready task in global run-queue. + if (NULL == t) + { + t = iv_taskList.remove(); + } + // Choose idle task if no other ready task is available. if (NULL == t) { - t = CpuManager::getCurrentCPU()->idle_task; + t = cpu->idle_task; // TODO: Set short decrementer. setDEC(TimeManager::getTimeSliceCount()); } @@ -33,6 +62,6 @@ void Scheduler::setNextRunnable() { setDEC(TimeManager::getTimeSliceCount()); } - + TaskManager::setCurrentTask(t); } |