diff options
author | KaiGai Kohei <kaigai@ak.jp.nec.com> | 2006-06-25 05:49:24 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 10:01:25 -0700 |
commit | 0e4648141af02331f21aabcd34940c70f09a2d04 (patch) | |
tree | 3e4dea992a8e3f3194be04a0fd3e14c24a313ee7 /include/linux | |
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 'include/linux')
-rw-r--r-- | include/linux/acct.h | 4 | ||||
-rw-r--r-- | include/linux/sched.h | 7 |
2 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/acct.h b/include/linux/acct.h index 3d54fbcf969e..5bca9b3ef2d7 100644 --- a/include/linux/acct.h +++ b/include/linux/acct.h @@ -121,12 +121,16 @@ struct vfsmount; struct super_block; extern void acct_auto_close_mnt(struct vfsmount *m); extern void acct_auto_close(struct super_block *sb); +extern void acct_init_pacct(struct pacct_struct *pacct); +extern void acct_collect(); extern void acct_process(long exitcode); extern void acct_update_integrals(struct task_struct *tsk); extern void acct_clear_integrals(struct task_struct *tsk); #else #define acct_auto_close_mnt(x) do { } while (0) #define acct_auto_close(x) do { } while (0) +#define acct_init_pacct(x) do { } while (0) +#define acct_collect() do { } while (0) #define acct_process(x) do { } while (0) #define acct_update_integrals(x) do { } while (0) #define acct_clear_integrals(task) do { } while (0) diff --git a/include/linux/sched.h b/include/linux/sched.h index 38b4791e6a5d..abada7c1d5e4 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -358,6 +358,10 @@ struct sighand_struct { spinlock_t siglock; }; +struct pacct_struct { + unsigned long ac_mem; +}; + /* * NOTE! "signal_struct" does not have it's own * locking, because a shared signal_struct always @@ -449,6 +453,9 @@ struct signal_struct { struct key *session_keyring; /* keyring inherited over fork */ struct key *process_keyring; /* keyring private to this process */ #endif +#ifdef CONFIG_BSD_PROCESS_ACCT + struct pacct_struct pacct; /* per-process accounting information */ +#endif }; /* Context switch must be unlocked if interrupts are to be enabled */ |