diff options
author | KaiGai Kohei <kaigai@ak.jp.nec.com> | 2006-06-25 08:49:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 13:01:25 -0400 |
commit | 0e4648141af02331f21aabcd34940c70f09a2d04 (patch) | |
tree | 3e4dea992a8e3f3194be04a0fd3e14c24a313ee7 /kernel/exit.c | |
parent | 6bc392741d661eb84be503d1fdf14b6746615e4c (diff) |
[PATCH] pacct: add pacct_struct to fix some pacct bugs.
The pacct facility need an i/o operation when an accounting record is
generated. There is a possibility to wake OOM killer up. If OOM killer is
activated, it kills some processes to make them release process memory
regions.
But acct_process() is called in the killed processes context before calling
exit_mm(), so those processes cannot release own memory. In the results, any
processes stop in this point and it finally cause a system stall.
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 601263c0806f..819d82c2efba 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -894,7 +894,7 @@ fastcall NORET_TYPE void do_exit(long code) | |||
894 | if (group_dead) { | 894 | if (group_dead) { |
895 | hrtimer_cancel(&tsk->signal->real_timer); | 895 | hrtimer_cancel(&tsk->signal->real_timer); |
896 | exit_itimers(tsk->signal); | 896 | exit_itimers(tsk->signal); |
897 | acct_process(code); | 897 | acct_collect(); |
898 | } | 898 | } |
899 | if (unlikely(tsk->robust_list)) | 899 | if (unlikely(tsk->robust_list)) |
900 | exit_robust_list(tsk); | 900 | exit_robust_list(tsk); |
@@ -906,6 +906,8 @@ fastcall NORET_TYPE void do_exit(long code) | |||
906 | audit_free(tsk); | 906 | audit_free(tsk); |
907 | exit_mm(tsk); | 907 | exit_mm(tsk); |
908 | 908 | ||
909 | if (group_dead) | ||
910 | acct_process(code); | ||
909 | exit_sem(tsk); | 911 | exit_sem(tsk); |
910 | __exit_files(tsk); | 912 | __exit_files(tsk); |
911 | __exit_fs(tsk); | 913 | __exit_fs(tsk); |