diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-20 17:55:12 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-20 17:55:12 -0800 |
| commit | 3d3f22bee87945d0590568873e93268a2639e7db (patch) | |
| tree | ec9ae8a2232c8104739f760bf2c3a21f33c85050 /kernel | |
| parent | bf6ca9021e77c56781b2858c054e2d7e55f64178 (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.c | 5 | ||||
| -rw-r--r-- | kernel/fork.c | 10 |
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); |
