summaryrefslogtreecommitdiffstats
path: root/src/kernel/scheduler.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-05-24 22:01:46 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-05-26 10:40:30 -0500
commit97399f8e048f3fe76bc9fe179546990b8ba54562 (patch)
tree6491efcd31e67ef6f4670659965cbc75a04ccd9b /src/kernel/scheduler.C
parent90d4e5df06e6108f846013a48b996e936adeffec (diff)
downloadtalos-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.C37
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);
}
OpenPOWER on IntegriCloud