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 | |
| 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')
| -rw-r--r-- | src/kernel/cpumgr.C | 1 | ||||
| -rw-r--r-- | src/kernel/scheduler.C | 37 | ||||
| -rw-r--r-- | src/kernel/taskmgr.C | 3 |
3 files changed, 37 insertions, 4 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C index 46d1baa93..9f8e1feec 100644 --- a/src/kernel/cpumgr.C +++ b/src/kernel/cpumgr.C @@ -55,6 +55,7 @@ void CpuManager::startCPU(ssize_t i) // Initialize CPU. cpu->cpu = i; cpu->scheduler = &Singleton<Scheduler>::instance(); + cpu->scheduler_extra = NULL; cpu->kernel_stack = (void*) (((uint64_t)PageManager::allocatePage(4)) + 16320); 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); } diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C index 0ddc3918a..8225b7da3 100644 --- a/src/kernel/taskmgr.C +++ b/src/kernel/taskmgr.C @@ -4,6 +4,7 @@ #include <kernel/pagemgr.H> #include <kernel/cpumgr.H> #include <arch/ppc.H> +#include <string.h> void TaskManager::idleTaskLoop(void* unused) { @@ -49,6 +50,8 @@ task_t* TaskManager::_createTask(TaskManager::task_fn_t t, void* p, bool withStack) { task_t* task = new task_t; + memset(task, '\0', sizeof(task_t)); + task->tid = this->getNextTid(); // Function pointer 't' is actually a TOC entry. |

