summaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-03-18 17:17:51 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-03-18 17:17:51 +0000
commitf1382dc4850bb459d24a81c6cb0ef93ea7bd4a79 (patch)
tree225271a3d5dcd4e9dea5ee393556abd754c964b1 /kernel/exit.c
parent135b00fc2e90e605ac2a96b20b0ebd93851a3f89 (diff)
o Merge with Linux 2.1.90.
o Divide L1 cache sizes by 1024 before printing, makes the numbers a bit more credible ...
Diffstat (limited to 'kernel/exit.c')
-rw-r--r--kernel/exit.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index 9824f5806..2d5835ac8 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -27,7 +27,6 @@
#include <asm/mmu_context.h>
extern void sem_exit (void);
-extern void kerneld_exit(void);
int getrusage(struct task_struct *, int, struct rusage *);
@@ -44,8 +43,14 @@ void release(struct task_struct * p)
charge_uid(p, -1);
nr_tasks--;
add_free_taskslot(p->tarray_ptr);
- unhash_pid(p);
- REMOVE_LINKS(p);
+ {
+ unsigned long flags;
+
+ write_lock_irqsave(&tasklist_lock, flags);
+ unhash_pid(p);
+ REMOVE_LINKS(p);
+ write_unlock_irqrestore(&tasklist_lock, flags);
+ }
release_thread(p);
current->cmin_flt += p->min_flt + p->cmin_flt;
current->cmaj_flt += p->maj_flt + p->cmaj_flt;
@@ -157,7 +162,7 @@ static inline void close_files(struct files_struct * files)
unsigned long set = files->open_fds.fds_bits[j];
i = j * __NFDBITS;
j++;
- if (i >= NR_OPEN)
+ if (i >= files->max_fds)
break;
while (set) {
if (set & 1) {
@@ -183,6 +188,13 @@ static inline void __exit_files(struct task_struct *tsk)
tsk->files = NULL;
if (!--files->count) {
close_files(files);
+ /*
+ * Free the fd array as appropriate ...
+ */
+ if (NR_OPEN * sizeof(struct file *) == PAGE_SIZE)
+ free_page((unsigned long) files->fd);
+ else
+ kfree(files->fd);
kmem_cache_free(files_cachep, files);
}
}
@@ -328,7 +340,6 @@ fake_volatile:
acct_process(code);
del_timer(&current->real_timer);
sem_exit();
- kerneld_exit();
__exit_mm(current);
#if CONFIG_AP1000
exit_msc(current);