patch-2.3.11 linux/kernel/exit.c
Next file: linux/kernel/fork.c
Previous file: linux/ipc/shm.c
Back to the patch index
Back to the overall index
- Lines: 63
- Date:
Wed Jul 21 13:14:41 1999
- Orig file:
v2.3.10/linux/kernel/exit.c
- Orig date:
Thu Jul 8 15:42:21 1999
diff -u --recursive --new-file v2.3.10/linux/kernel/exit.c linux/kernel/exit.c
@@ -27,29 +27,15 @@
if (p != current) {
#ifdef __SMP__
/*
- * Wait to make sure the process isn't active on any
- * other CPU
+ * Wait to make sure the process isn't on the
+ * runqueue (active on some other CPU still)
*/
- for (;;) {
- int has_cpu;
- spin_lock_irq(&runqueue_lock);
- has_cpu = p->has_cpu;
- spin_unlock_irq(&runqueue_lock);
- if (!has_cpu)
- break;
- do {
- barrier();
- } while (p->has_cpu);
- }
+ do {
+ barrier();
+ } while (p->has_cpu);
#endif
free_uid(p);
- nr_tasks--;
- add_free_taskslot(p->tarray_ptr);
-
- write_lock_irq(&tasklist_lock);
- unhash_pid(p);
- REMOVE_LINKS(p);
- write_unlock_irq(&tasklist_lock);
+ unhash_process(p);
release_thread(p);
current->cmin_flt += p->min_flt + p->cmin_flt;
@@ -243,19 +229,18 @@
__exit_sighand(tsk);
}
+/*
+ * Turn us into a lazy TLB process if we
+ * aren't already..
+ */
static inline void __exit_mm(struct task_struct * tsk)
{
struct mm_struct * mm = tsk->mm;
- /* Set us up to use the kernel mm state */
- if (mm != &init_mm) {
- flush_cache_mm(mm);
- flush_tlb_mm(mm);
- destroy_context(mm);
- tsk->mm = &init_mm;
- tsk->swappable = 0;
- SET_PAGE_DIR(tsk, swapper_pg_dir);
+ if (mm) {
mm_release();
+ atomic_inc(&mm->mm_count);
+ tsk->mm = NULL;
mmput(mm);
}
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)