summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-10-28 17:02:22 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-11-01 15:15:33 -0500
commit0d03f507d4952bc2f2c746ee60dcd155ba4ea507 (patch)
treea14221562bdd4b2bcd1281eae1ca9ab18e968f1d /src/kernel
parent308c993928937070e462c027f7e6b183e7858a2a (diff)
downloadtalos-hostboot-0d03f507d4952bc2f2c746ee60dcd155ba4ea507.tar.gz
talos-hostboot-0d03f507d4952bc2f2c746ee60dcd155ba4ea507.zip
Assert on crash of a parent-less task.
- Assert whenever a parent-less task crashes. - Clean up task structures for parent-less tasks. Change-Id: Idf613cbbd51e6ec87e5c1455c30b3051096ed807 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/468 Tested-by: Jenkins Server Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com> Reviewed-by: Melissa J. Connell <missyc@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/taskmgr.C40
1 files changed, 37 insertions, 3 deletions
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index 0ed493801..ad2aa3af5 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -33,6 +33,7 @@
#include <arch/ppc.H>
#include <string.h>
#include <limits.h>
+#include <assert.h>
extern "C" void userspace_task_entry();
@@ -169,13 +170,13 @@ void TaskManager::_endTask(task_t* t, void* retval, int status)
if (getCurrentTask() == t)
t->cpu->scheduler->setNextRunnable();
+ iv_spinlock.lock();
+
// Update status in tracker.
t->tracker->status = status;
t->tracker->retval = retval;
t->tracker->task = NULL; // NULL signifies task is complete for now.
- iv_spinlock.lock();
-
if (t->detached) // If detached, just clean up the tracker.
{
removeTracker(t->tracker);
@@ -207,6 +208,19 @@ void TaskManager::_endTask(task_t* t, void* retval, int status)
parent->task->cpu->scheduler->addTask(parent->task);
}
}
+ else if (!t->tracker->parent) // Parented by kernel.
+ {
+ if (status == TASK_STATUS_CRASHED)
+ {
+ printk("Critical: Parentless task %d crashed.\n",
+ t->tid);
+ kassert(status != TASK_STATUS_CRASHED);
+ }
+ else
+ {
+ removeTracker(t->tracker);
+ }
+ }
}
iv_spinlock.unlock();
@@ -326,7 +340,27 @@ void TaskManager::removeTracker(task_tracking_t* t)
while(task_tracking_t* child = t->children.remove())
{
child->parent = parent;
- trackingList->insert(child);
+ if ((!parent) && (!child->task)) // Deal with finished children
+ // becoming parented by the kernel.
+ {
+ if (child->status == TASK_STATUS_CRASHED)
+ {
+ trackingList->insert(child); // Insert into kernel list so it
+ // is there for debug.
+
+ printk("Critical: Parentless task %d crashed.\n",
+ child->key);
+ kassert(child->status != TASK_STATUS_CRASHED);
+ }
+ else
+ {
+ removeTracker(child);
+ }
+ }
+ else
+ {
+ trackingList->insert(child);
+ }
}
// Delete tracker object.
OpenPOWER on IntegriCloud