All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch 1/3] add basic accounting fields to taskstats
@ 2006-07-31 19:20 Jay Lan
  2006-07-31 20:23 ` Shailabh Nagar
  2006-08-01 14:24 ` Balbir Singh
  0 siblings, 2 replies; 15+ messages in thread
From: Jay Lan @ 2006-07-31 19:20 UTC (permalink / raw)
  To: Andrew Morton
  Cc: lkml, Shailabh Nagar, Balbir Singh, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

[-- Attachment #1: Type: text/plain, Size: 166 bytes --]

This patch adds a few basic accounting fields to the taskstat
struct and a bacct_add_tsk() routine to fill the data on
exit.


Signed-off-by: Jay Lan <jlan@sgi.com>


[-- Attachment #2: taskstats-acct.patch --]
[-- Type: text/plain, Size: 4560 bytes --]

Index: linux/include/linux/taskstats.h
===================================================================
--- linux.orig/include/linux/taskstats.h	2006-07-31 11:38:54.132326042 -0700
+++ linux/include/linux/taskstats.h	2006-07-31 11:42:10.634609610 -0700
@@ -2,6 +2,7 @@
  *
  * Copyright (C) Shailabh Nagar, IBM Corp. 2006
  *           (C) Balbir Singh,   IBM Corp. 2006
+ *           (C) Jay Lan,        SGI, 2006
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2.1 of the GNU Lesser General Public License
@@ -29,13 +30,18 @@
  *	c) add new fields after version comment; maintain 64-bit alignment
  */
 
-#define TASKSTATS_VERSION	1
+#define TASKSTATS_VERSION	2
+#define TASK_COMM_LEN		16
 
 struct taskstats {
 
 	/* Version 1 */
 	__u16	version;
-	__u16	padding[3];	/* Userspace should not interpret the padding
+	__u8	ac_flag;	/* Record flags */
+	__u8	ac_nice;	/* task_nice */
+	__u8	ac_sched;	/* Scheduling discipline */
+	__u8	ac_pad;
+	__u16	padding;	/* Userspace should not interpret the padding
 				 * field which can be replaced by useful
 				 * fields if struct taskstats is extended.
 				 */
@@ -88,6 +94,19 @@ struct taskstats {
 	__u64	cpu_run_virtual_total;
 	/* Delay accounting fields end */
 	/* version 1 ends here */
+
+	/* Basic Accounting Fields start */
+	char	ac_comm[TASK_COMM_LEN];	/* Command name */
+	__u32	ac_exitcode;		/* Exit status */
+	__u32	ac_uid;			/* User ID */
+	__u32	ac_gid;			/* Group ID */
+	__u32	ac_pid;			/* Process ID */
+	__u32	ac_ppid;		/* Parent process ID */
+	__u32	ac_btime;		/* Begin time [sec sinec 1970] */
+	__u64	ac_etime;		/* Elapsed time [usec] */
+	__u64	ac_utime;		/* User CPU time [usec] */
+	__u64	ac_stime;		/* SYstem CPU time [usec] */
+	/* Basic Accounting Fields end */
 };
 
 
Index: linux/kernel/taskstats.c
===================================================================
--- linux.orig/kernel/taskstats.c	2006-07-31 11:38:54.160326367 -0700
+++ linux/kernel/taskstats.c	2006-07-31 11:44:54.952523699 -0700
@@ -3,6 +3,7 @@
  *
  * Copyright (C) Shailabh Nagar, IBM Corp. 2006
  *           (C) Balbir Singh,   IBM Corp. 2006
+ *           (C) Jay Lan,        SGI, 2006
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -18,6 +19,7 @@
 
 #include <linux/kernel.h>
 #include <linux/taskstats_kern.h>
+#include <linux/acct.h>
 #include <linux/delayacct.h>
 #include <linux/cpumask.h>
 #include <linux/percpu.h>
@@ -172,6 +174,53 @@ static void send_cpu_listeners(struct sk
 	up_write(&listeners->sem);
 }
 
+
+#define USEC_PER_TICK	(USEC_PER_SEC/HZ)
+/*
+ * fill in basic accounting fields
+ */
+static void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk)
+{
+	u64	run_time;
+	struct timespec uptime;
+
+	/* calculate run_time in nsec */
+	do_posix_clock_monotonic_gettime(&uptime);
+	run_time = (u64)uptime.tv_sec*NSEC_PER_SEC + uptime.tv_nsec;
+	run_time -= (u64)current->group_leader->start_time.tv_sec * NSEC_PER_SEC
+			+ current->group_leader->start_time.tv_nsec;
+	do_div(run_time, NSEC_PER_USEC);	/* rebase run_time to usec */
+	stats->ac_etime = run_time;
+	do_div(run_time, USEC_PER_SEC);		/* rebase run_time to sec */
+	stats->ac_btime = xtime.tv_sec - run_time;
+	if (thread_group_leader(tsk)) {
+		stats->ac_exitcode = tsk->exit_code;
+		if (tsk->flags & PF_FORKNOEXEC)
+			stats->ac_flag |= AFORK;
+	}
+	if (tsk->flags & PF_SUPERPRIV)
+		stats->ac_flag |= ASU;
+	if (tsk->flags & PF_DUMPCORE)
+		stats->ac_flag |= ACORE;
+	if (tsk->flags & PF_SIGNALED)
+		stats->ac_flag |= AXSIG;
+	stats->ac_nice	= task_nice(tsk);
+	stats->ac_sched	= tsk->policy;
+	stats->ac_uid	= tsk->uid;
+	stats->ac_gid	= tsk->gid;
+	stats->ac_pid	= tsk->pid;
+	stats->ac_ppid	= (tsk->parent) ? tsk->parent->pid : 0;
+	stats->ac_utime	= tsk->utime * USEC_PER_TICK;
+	stats->ac_stime	= tsk->stime * USEC_PER_TICK;
+	/* Each process gets a minimum of a half tick cpu time */
+	if ((stats->ac_utime == 0) && (stats->ac_stime == 0)) {
+		stats->ac_stime = USEC_PER_TICK/2;
+	}
+
+	strncpy(stats->ac_comm, tsk->comm, sizeof(stats->ac_comm));
+}
+
+
 static int fill_pid(pid_t pid, struct task_struct *pidtsk,
 		struct taskstats *stats)
 {
@@ -200,6 +249,9 @@ static int fill_pid(pid_t pid, struct ta
 	delayacct_add_tsk(stats, tsk);
 	stats->version = TASKSTATS_VERSION;
 
+	/* fill in basic acct fields */
+	bacct_add_tsk(stats, tsk);
+
 	/* Define err: label here if needed */
 	put_task_struct(tsk);
 	return rc;


^ permalink raw reply	[flat|nested] 15+ messages in thread
* Re: [patch 1/3] add basic accounting fields to taskstats
@ 2006-08-08 14:57 Al Boldi
  0 siblings, 0 replies; 15+ messages in thread
From: Al Boldi @ 2006-08-08 14:57 UTC (permalink / raw)
  To: linux-kernel

Balbir Singh wrote:
> Jay Lan wrote:
> > I figured this out. The tsk->stime (and utime as well) are
> > charged by 1 tick (or cputime) from the timer interrupt handler
> > through update_process_times->account_{user,system}_time.
> >
> > The clock resolution is a tick. Any short process less than
> > 1 tick will the counter being 0. It can be from 0 to 0.99999...
> > tick. A half tick is the average value.
>
> But the scheduling happens in the granularity of a tick, so the minimum
> each task gets is a tick.
>
> > I think it makes more sense to assign a half tick than assign
> > 1 usec to the stime. What do you think? Certainly the code need
> > better explanation.
>
> Can't we leave these values as zero in case both stime and utime are zero.

FYI, see "Incorrect CPU process accounting using CONFIG_HZ=100" thread.

IMHO, in-lined process accounting is probably critical for successful 
scheduling.

Thanks!

--
Al


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2006-08-08 16:40 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-31 19:20 [patch 1/3] add basic accounting fields to taskstats Jay Lan
2006-07-31 20:23 ` Shailabh Nagar
2006-07-31 21:50   ` Jay Lan
2006-08-01 14:24 ` Balbir Singh
2006-08-01 21:51   ` Jay Lan
2006-08-02 15:31     ` Shailabh Nagar
2006-08-02 17:17       ` Balbir Singh
2006-08-02 17:37         ` Shailabh Nagar
2006-08-02 21:09         ` Andrew Morton
2006-08-02 23:47           ` Jay Lan
2006-08-03  3:02           ` Balbir Singh
2006-08-07 21:23     ` Jay Lan
2006-08-08  5:22       ` Balbir Singh
2006-08-08 16:40         ` Jay Lan
  -- strict thread matches above, loose matches on Subject: below --
2006-08-08 14:57 Al Boldi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.