[PATCH, RFC] remove task_cache entirely

Manfred Spraul (manfred@colorfullife.com)
Sun, 13 Jul 2003 13:57:41 +0200


This is a MIME-formatted message. If you see this text it means that your
E-mail software does not support MIME-formatted messages.

--=_courier-18569-1058098125-0001-2
Content-Type: text/plain; charset=iso-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

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().

What should we do with it? I would remove it entirely - it's dead code.
Any objections?

One problem is that order-1 allocations are not cached per-cpu - what
about using kmem_cache_alloc for the stack?

--
    Manfred

--=_courier-18569-1058098125-0001-2 Content-Type: text/plain; name=patch-remove-taskcache; charset=iso-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-remove-taskcache"

--- 2.5/kernel/fork.c 2003-07-13 13:15:01.000000000 +0200 +++ build-2.5/kernel/fork.c 2003-07-13 13:14:00.000000000 +0200 @@ -53,13 +53,6 @@ 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 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 @@ { 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;

--=_courier-18569-1058098125-0001-2--