summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.transmeta.com>2003-02-20 17:55:12 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2003-02-20 17:55:12 -0800
commit3d3f22bee87945d0590568873e93268a2639e7db (patch)
treeec9ae8a2232c8104739f760bf2c3a21f33c85050 /kernel
parentbf6ca9021e77c56781b2858c054e2d7e55f64178 (diff)
We don't need to wait for task in-activity in release_task() any more,
since we now properly reference-count the allocations and thus can't be freeing the thread structures from underneath the task running on another CPU. Move "free_uid(p->user)" and "security_task_free()" to __put_task_struct(), so that we're guaranteed to always have a user structure pointer.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c5
-rw-r--r--kernel/fork.c10
2 files changed, 10 insertions, 5 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index 224cb7adc73f..f01c77dfcee1 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -66,12 +66,7 @@ void release_task(struct task_struct * p)
BUG_ON(p->state < TASK_ZOMBIE);
- if (p != current)
- wait_task_inactive(p);
-
atomic_dec(&p->user->processes);
- security_task_free(p);
- free_uid(p->user);
write_lock_irq(&tasklist_lock);
if (unlikely(p->ptrace))
__ptrace_unlink(p);
diff --git a/kernel/fork.c b/kernel/fork.c
index 203fe93429de..8a6032c5f7ec 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -76,7 +76,17 @@ void __put_task_struct(struct task_struct *tsk)
{
WARN_ON(!(tsk->state & (TASK_DEAD | TASK_ZOMBIE)));
WARN_ON(atomic_read(&tsk->usage));
+ WARN_ON(tsk == current);
+ security_task_free(tsk);
+ free_uid(tsk->user);
+
+ /*
+ * The task cache is effectively disabled right now.
+ * Do we want it? The slab cache already has per-cpu
+ * stuff, but the thread info (usually a order-1 page
+ * allocation) doesn't.
+ */
if (tsk != current) {
free_thread_info(tsk->thread_info);
kmem_cache_free(task_struct_cachep,tsk);