From 94eda0969bf8f7ea58872e5c1069e2c0b203e877 Mon Sep 17 00:00:00 2001 From: Ingo Molnar Date: Sun, 22 Sep 2002 21:46:20 -0700 Subject: [PATCH] de-xchg fork.c This fixes all xchg()'s and a preemption bug. --- kernel/fork.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'kernel/fork.c') diff --git a/kernel/fork.c b/kernel/fork.c index 4688c232b9a5..062a4d1f9c3e 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -62,13 +62,15 @@ void __put_task_struct(struct task_struct *tsk) free_thread_info(tsk->thread_info); kmem_cache_free(task_struct_cachep,tsk); } else { - int cpu = smp_processor_id(); + int cpu = get_cpu(); - tsk = xchg(task_cache + cpu, tsk); + tsk = task_cache[cpu]; if (tsk) { free_thread_info(tsk->thread_info); kmem_cache_free(task_struct_cachep,tsk); } + task_cache[cpu] = current; + put_cpu(); } } @@ -126,8 +128,11 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) { struct task_struct *tsk; struct thread_info *ti; + int cpu = get_cpu(); - tsk = xchg(task_cache + smp_processor_id(), NULL); + tsk = task_cache[cpu]; + task_cache[cpu] = NULL; + put_cpu(); if (!tsk) { ti = alloc_thread_info(); if (!ti) -- cgit v1.2.3