Re: [patch 2/3] add CSA accounting to taskstats

From: Shailabh Nagar
Date: Mon Jul 31 2006 - 16:38:36 EST


Jay Lan wrote:
> This patch add CSA accounting fields to the taskstats struct
> and a kernel/csa.c to fill the data on exit.
>
>
> Signed-off-by: Jay Lan <jlan@xxxxxxx>
>
>
> ------------------------------------------------------------------------
>
> Index: linux/include/linux/taskstats.h
> ===================================================================
> --- linux.orig/include/linux/taskstats.h 2006-07-31 11:42:10.000000000 -0700
> +++ linux/include/linux/taskstats.h 2006-07-31 11:50:00.412433042 -0700
> @@ -107,6 +107,21 @@ struct taskstats {
> __u64 ac_utime; /* User CPU time [usec] */
> __u64 ac_stime; /* SYstem CPU time [usec] */
> /* Basic Accounting Fields end */
> +
> + /* CSA accounting fields start */
> + __u16 csa_revision; /* CSA Revision */

May be helpful to add a note here that every time csa_revision is changed,
TASKSTATS_VERSION also needs to be bumped up.

> + __u16 csa_pad[3]; /* Unused */


> + __u64 acct_rss_mem1; /* accumulated rss usage */
> + __u64 acct_vm_mem1; /* accumulated virtual memory usage */
> + __u64 hiwater_rss; /* High-watermark of RSS usage */
> + __u64 hiwater_vm; /* High-water virtual memory usage */


> + __u64 ac_minflt; /* Minor Page Fault */
> + __u64 ac_majflt; /* Major Page Fault */

Can the number of prefixes be reduced ? In the space of a few fields, we have
ac_*, csa_*, acct_* and plain (for hiwater_rss/vm)


> + __u64 ac_chr; /* bytes read */
> + __u64 ac_chw; /* bytes written */
> + __u64 ac_scr; /* read syscalls */
> + __u64 ac_scw; /* write syscalls */

read_char,
write_char,
read_syscalls,
write_syscalls,

perhaps (esp. if you're dropping the ac_ prefix) ?

> + /* CSA accounting fields end */
> };


>
>
> Index: linux/init/Kconfig
> ===================================================================
> --- linux.orig/init/Kconfig 2006-07-31 11:38:21.000000000 -0700
> +++ linux/init/Kconfig 2006-07-31 11:47:23.214410140 -0700
> @@ -182,6 +182,31 @@ config TASK_DELAY_ACCT
>
> Say N if unsure.
>
> +config CSA_ACCT
> + bool "Enable CSA Job Accounting (EXPERIMENTAL)"
> + depends on TASKSTATS
> + help
> + Comprehensive System Accounting (CSA) provides job level
> + accounting of resource usage. The accounting records are
> + written by the kernel into a file. CSA user level scripts
> + and commands process the binary accounting records and
> + combine them by job identifier within system boot uptime
> + periods. These accounting records are then used to produce
> + reports and charge fees to users.
> +
> + Say Y here if you want job level accounting to be compiled
> + into the kernel. Say M here if you want the writing of
> + accounting records portion of this feature to be a loadable
> + module. Say N here if you do not want job level accounting
> + (the default).

The description above is tied to jobs which don't exist in the kernel.
There's no dependency of CSA on kernel-visible jobs anymore, right ?
Perhaps the blurb can clarify that jobs are defined in user space.

> +
> + The CSA commands and scripts package needs to be installed
> + to process the CSA accounting records. See
> + http://oss.sgi.com/projects/csa for further information
> + about CSA and download instructions for the CSA commands
> + package and documentation.
> +
> +
> config SYSCTL
> bool "Sysctl support" if EMBEDDED
> default y
> Index: linux/kernel/Makefile
> ===================================================================
> --- linux.orig/kernel/Makefile 2006-07-31 11:38:21.000000000 -0700
> +++ linux/kernel/Makefile 2006-07-31 11:47:23.218410191 -0700
> @@ -50,6 +50,7 @@ obj-$(CONFIG_RCU_TORTURE_TEST) += rcutor
> obj-$(CONFIG_RELAY) += relay.o
> obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
> obj-$(CONFIG_TASKSTATS) += taskstats.o
> +obj-$(CONFIG_CSA_ACCT) += csa.o
>
> ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y)
> # According to Alan Modra <alan@xxxxxxxxxxxxxxxx>, the -fno-omit-frame-pointer is
> Index: linux/kernel/csa.c
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ linux/kernel/csa.c 2006-07-31 11:47:23.218410191 -0700
> @@ -0,0 +1,46 @@
> +/*
> + * This file is subject to the terms and conditions of the GNU General Public
> + * License. See the file "COPYING" in the main directory of this archive
> + * for more details.
> + *
> + * Copyright (c) 2006 Silicon Graphics, Inc All Rights Reserved.
> + */
> +
> +
> +/*
> + * CSA (Comprehensive System Accounting)
> + * Job Accounting for Linux
> + *
> + * This header file contains the definitions needed for job
> + * accounting. The kernel CSA accounting module code and all
> + * user-level programs that try to write or process the binary job
> + * accounting data must include this file.

Again, job dependency might need some clarification.

> + *
> + * This kernel header file and the csa.h in the csa userland source
> + * rpm share same data struct declaration and #define's. Do not modify
> + * one without modify the other one as well. The compatibility between
> + * userland and the kernel is ensured by using the 'ah_revision' field
> + * of struct achead.

Leftover from older documentation ?

> + *
> + */
> +
> +#include <linux/taskstats.h>
> +#include <linux/csa_kern.h>
> +#include <linux/sched.h>
> +
> +void csa_add_tsk(struct taskstats *stats, struct task_struct *p)
> +{
> + stats->csa_revision = REV_CSA;
> + stats->acct_rss_mem1 = p->acct_rss_mem1;
> + stats->acct_vm_mem1 = p->acct_vm_mem1;
> + if (p->mm) {
> + stats->hiwater_rss = p->mm->hiwater_rss;
> + stats->hiwater_vm = p->mm->hiwater_vm;
> + }
> + stats->ac_minflt = p->min_flt;
> + stats->ac_majflt = p->maj_flt;
> + stats->ac_chr = p->rchar;
> + stats->ac_chw = p->wchar;
> + stats->ac_scr = p->syscr;
> + stats->ac_scw = p->syscw;
> +}
> Index: linux/kernel/taskstats.c
> ===================================================================
> --- linux.orig/kernel/taskstats.c 2006-07-31 11:44:54.000000000 -0700
> +++ linux/kernel/taskstats.c 2006-07-31 11:47:23.218410191 -0700
> @@ -21,6 +21,7 @@
> #include <linux/taskstats_kern.h>
> #include <linux/acct.h>
> #include <linux/delayacct.h>
> +#include <linux/csa_kern.h>
> #include <linux/cpumask.h>
> #include <linux/percpu.h>
> #include <net/genetlink.h>
> @@ -252,6 +253,9 @@ static int fill_pid(pid_t pid, struct ta
> /* fill in basic acct fields */
> bacct_add_tsk(stats, tsk);
>
> + /* fill in csa fields */
> + csa_add_tsk(stats, tsk);
> +
> /* Define err: label here if needed */
> put_task_struct(tsk);
> return rc;
> Index: linux/include/linux/csa_kern.h
> ===================================================================
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ linux/include/linux/csa_kern.h 2006-07-31 11:47:23.218410191 -0700
> @@ -0,0 +1,31 @@
> +/*
> + * This file is subject to the terms and conditions of the GNU General Public
> + * License. See the file "COPYING" in the main directory of this archive
> + * for more details.
> + *
> + * Copyright (c) 2006 Silicon Graphics, Inc All Rights Reserved.
> + */
> +
> +#ifndef _CSA_KERN_H
> +#define _CSA_KERN_H
> +
> +#ifdef CONFIG_CSA_ACCT
> +extern void csa_add_tsk(struct taskstats *, struct task_struct *);
> +#else
> +#define csa_add_tsk(x) do { } while (0)

This won't compile right...number of args differ.

> +#endif
> +
> +/*
> + * Record revision levels.
> + *
> + * These are incremented to indicate that a record's format has changed since
> + * a previous release.
> + *
> + * History: 05000 The first rev in Linux
> + * 06000 Major rework to clean up unused fields and features.
> + * No binary compatibility with earlier rev.
> + * 07000 Convert to taskstats interface
> + */
> +#define REV_CSA 07000 /* Kernel: CSA base record */
> +
> +#endif /* _CSA_KERN_H */
>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/