diff options
| author | Andrew Morton <akpm@osdl.org> | 2003-07-17 19:26:01 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2003-07-17 19:26:01 -0700 |
| commit | 4da99f75ef7a17c2a789856167fb6270e0a2e4b8 (patch) | |
| tree | 93014e22516f976b8b7a54e2232a077ff2ca62a2 /kernel/fork.c | |
| parent | 04af9e586441d7a7de50675140a9b78a3d902ae3 (diff) | |
[PATCH] remove task_cache entirely
From: Manfred Spraul <manfred@colorfullife.com>
kernel/fork.c contains a disabled cache for task stuctures. task
structures are placed into the task cache only if "tsk==current", and
"tsk==current" is impossible. There is even a WARN_ON against that in
__put_task_struct().
So remove it entirely - it's dead code.
One problem is that order-1 allocations are not cached per-cpu - we can
use kmalloc for the stack.
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 54 |
1 files changed, 11 insertions, 43 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 2928684629e4..ac467bc0d13c 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -53,13 +53,6 @@ DEFINE_PER_CPU(unsigned long, process_counts) = 0; rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED; /* outer */ -/* - * A per-CPU task cache - this relies on the fact that - * the very last portion of sys_exit() is executed with - * preemption turned off. - */ -static task_t *task_cache[NR_CPUS] __cacheline_aligned; - int nr_processes(void) { int cpu; @@ -80,26 +73,8 @@ static kmem_cache_t *task_struct_cachep; static void free_task(struct task_struct *tsk) { - /* - * 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); - free_task_struct(tsk); - } else { - int cpu = get_cpu(); - - tsk = task_cache[cpu]; - if (tsk) { - free_thread_info(tsk->thread_info); - free_task_struct(tsk); - } - task_cache[cpu] = current; - put_cpu(); - } + free_thread_info(tsk->thread_info); + free_task_struct(tsk); } void __put_task_struct(struct task_struct *tsk) @@ -220,25 +195,18 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) { struct task_struct *tsk; struct thread_info *ti; - int cpu = get_cpu(); prepare_to_copy(orig); - tsk = task_cache[cpu]; - task_cache[cpu] = NULL; - put_cpu(); - if (!tsk) { - tsk = alloc_task_struct(); - if (!tsk) - return NULL; - - ti = alloc_thread_info(tsk); - if (!ti) { - free_task_struct(tsk); - return NULL; - } - } else - ti = tsk->thread_info; + tsk = alloc_task_struct(); + if (!tsk) + return NULL; + + ti = alloc_thread_info(tsk); + if (!ti) { + free_task_struct(tsk); + return NULL; + } *ti = *orig->thread_info; *tsk = *orig; |
