aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorJay Lan <jlan@engr.sgi.com>2005-01-04 05:25:39 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-01-04 05:25:39 -0800
commitb6a6107abf22149c9cedc68149d3fd78a76f7e34 (patch)
treede3c6674a0693dbfce15bfee0e59ce4f66ffc879 /kernel
parent9ca7d6f6cdc862fdebc72c4c15249cbb729a2f0f (diff)
downloadhistory-b6a6107abf22149c9cedc68149d3fd78a76f7e34.tar.gz
[PATCH] enhanced Memory accounting data collection
This patch is to offer common accounting data collection method at memory usage for various accounting packages including BSD accounting, ELSA, CSA and any other acct packages that use a common layer of data collection. New struct fields are added to mm_struct to save high watermarks of rss usage as well as virtual memory usage. New struct fields are added to task_struct to collect accumulated rss usage and vm usages. These data are collected on per process basis. Signed-off-by: Jay Lan <jlan@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/acct.c31
-rw-r--r--kernel/exit.c2
-rw-r--r--kernel/fork.c6
3 files changed, 39 insertions, 0 deletions
diff --git a/kernel/acct.c b/kernel/acct.c
index 4a3bd224a83620..311ec9c0be533d 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -528,3 +528,34 @@ void acct_process(long exitcode)
do_acct_process(exitcode, file);
fput(file);
}
+
+
+/*
+ * acct_update_integrals
+ * - update mm integral fields in task_struct
+ */
+void acct_update_integrals(void)
+{
+ struct task_struct *tsk = current;
+
+ if (likely(tsk->mm)) {
+ long delta = tsk->stime - tsk->acct_stimexpd;
+
+ tsk->acct_stimexpd = tsk->stime;
+ tsk->acct_rss_mem1 += delta * tsk->mm->rss;
+ tsk->acct_vm_mem1 += delta * tsk->mm->total_vm;
+ }
+}
+
+/*
+ * acct_clear_integrals
+ * - clear the mm integral fields in task_struct
+ */
+void acct_clear_integrals(struct task_struct *tsk)
+{
+ if (tsk) {
+ tsk->acct_stimexpd = 0;
+ tsk->acct_rss_mem1 = 0;
+ tsk->acct_vm_mem1 = 0;
+ }
+}
diff --git a/kernel/exit.c b/kernel/exit.c
index 64bc9502cd1cb6..4969d831d36280 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -806,6 +806,8 @@ fastcall NORET_TYPE void do_exit(long code)
ptrace_notify((PTRACE_EVENT_EXIT << 8) | SIGTRAP);
}
+ acct_update_integrals();
+ update_mem_hiwater();
group_dead = atomic_dec_and_test(&tsk->signal->live);
if (group_dead)
acct_process(code);
diff --git a/kernel/fork.c b/kernel/fork.c
index 0e8f874efe67b3..a512c5e927d5f9 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -39,6 +39,7 @@
#include <linux/audit.h>
#include <linux/profile.h>
#include <linux/rmap.h>
+#include <linux/acct.h>
#include <asm/pgtable.h>
#include <asm/pgalloc.h>
@@ -469,6 +470,9 @@ static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
if (retval)
goto free_pt;
+ mm->hiwater_rss = mm->rss;
+ mm->hiwater_vm = mm->total_vm;
+
good_mm:
tsk->mm = mm;
tsk->active_mm = mm;
@@ -880,6 +884,8 @@ static task_t *copy_process(unsigned long clone_flags,
p->wchar = 0; /* I/O counter: bytes written */
p->syscr = 0; /* I/O counter: read syscalls */
p->syscw = 0; /* I/O counter: write syscalls */
+ acct_clear_integrals(p);
+
p->lock_depth = -1; /* -1 = no lock */
do_posix_clock_monotonic_gettime(&p->start_time);
p->security = NULL;