From 3d3f22bee87945d0590568873e93268a2639e7db Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 20 Feb 2003 17:55:12 -0800 Subject: [PATCH] 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. --- kernel/exit.c | 5 ----- kernel/fork.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/kernel/exit.c b/kernel/exit.c index 224cb7adc73f9..f01c77dfcee1e 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 203fe93429de7..8a6032c5f7ecb 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); -- 2.53.0