linux-kernel.vger.kernel.org archive mirror
 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-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
  1 sibling, 1 reply; 15+ messages in thread
From: Shailabh Nagar @ 2006-07-31 20:23 UTC (permalink / raw)
  To: Jay Lan
  Cc: Andrew Morton, lkml, Balbir Singh, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

Jay Lan wrote:
> 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>
> 
> 
> ------------------------------------------------------------------------
> 
> 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;

[Minor comment] The choice of fields to fill the padding is visually separate
from the delay accounting fields which follow. Can a single field of the same
length, say ac_uid, be put here instead ?


Also, is the ac_ prefix needed for the common fields like comm, uid, gid, pid
that are pretty much coming straight out of task_struct ?

> +	__u16	padding;	/* Userspace should not interpret the padding

Combine the padding's ?

>  				 * 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] */

s/sinec/since

> +	__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;

Above chunk can be written more succintly using the new timespec_sub
function added.

ts = timespec_sub(&current->group_leader->start_time, &uptime);
stats->ac_etime = timespec_to_ns(&ts);
stats->ac_btime = xtime.tv_sec - ts.tv_sec;

Also, if there's any chance of run_time going negative due to overflow, that
needs to be handled in both original and succinct code (in latter you can
check for ts->tv_sec being negative).

> +	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);
> +

Should be added before stats->version is filled since that is
a generic field, not delay accounting specific.

>  	/* 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-07-31 20:23 ` Shailabh Nagar
@ 2006-07-31 21:50   ` Jay Lan
  0 siblings, 0 replies; 15+ messages in thread
From: Jay Lan @ 2006-07-31 21:50 UTC (permalink / raw)
  To: Shailabh Nagar
  Cc: Andrew Morton, lkml, Balbir Singh, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

Shailabh Nagar wrote:
> Jay Lan wrote:
> 
>>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>
>>
>>
>>------------------------------------------------------------------------
>>
>>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;
> 
> 
> [Minor comment] The choice of fields to fill the padding is visually separate
> from the delay accounting fields which follow. Can a single field of the same
> length, say ac_uid, be put here instead ?

You are right. I will replace those __u8 fields with the exitcode.

> 
> 
> Also, is the ac_ prefix needed for the common fields like comm, uid, gid, pid
> that are pretty much coming straight out of task_struct ?

And the GNU accounting use the ac_ prefix as well...
I lean to keep ac_ prefix so that people can link those fields to those
in the task_struct. However, i am fine with either way. Let's see if
there is other opinions on the prefix.

> 
> 
>>+	__u16	padding;	/* Userspace should not interpret the padding
> 
> 
> Combine the padding's ?
> 
> 
>> 				 * 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] */
> 
> 
> s/sinec/since

Good eyes! :)


> 
> 
>>+	__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;
> 
> 
> Above chunk can be written more succintly using the new timespec_sub
> function added.
> 
> ts = timespec_sub(&current->group_leader->start_time, &uptime);

It should be
   ts = timespec_sub(&uptime, &current->group_leader->start_time);

> stats->ac_etime = timespec_to_ns(&ts);

No, ac_etime is in microseconds, not nanoseconds.

> stats->ac_btime = xtime.tv_sec - ts.tv_sec;

This is correct.

> 
> Also, if there's any chance of run_time going negative due to overflow, that
> needs to be handled in both original and succinct code (in latter you can
> check for ts->tv_sec being negative).

The type of timespec->tv_sec is of type 'int'. It will takes 68 years
for an int to wrap wround. Most kernel code are not ready to deal with
it yet.

> 
> 
>>+	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);
>>+
> 
> 
> Should be added before stats->version is filled since that is
> a generic field, not delay accounting specific.

Will do. Thanks!


Regards,
  - jay

> 
> 
>> 	/* 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-07-31 19:20 [patch 1/3] add basic accounting fields to taskstats Jay Lan
  2006-07-31 20:23 ` Shailabh Nagar
@ 2006-08-01 14:24 ` Balbir Singh
  2006-08-01 21:51   ` Jay Lan
  1 sibling, 1 reply; 15+ messages in thread
From: Balbir Singh @ 2006-08-01 14:24 UTC (permalink / raw)
  To: Jay Lan
  Cc: Andrew Morton, lkml, Shailabh Nagar, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

Jay Lan wrote:
>  
> -#define TASKSTATS_VERSION	1
> +#define TASKSTATS_VERSION	2
> +#define TASK_COMM_LEN		16
>  

We should find a way to keep this in sync with with the definition
in linux/sched.h (won't we a warning if both this header and
linux/sched.h are included together?)



> + * 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;

I think you should use the portable cputime_xxxx() API since
tsk->utime and tsk->stime are of type cputime_t


> +	/* 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;
> +	}
> +

This is confusing. Half tick does not make any sense from the
scheduler view point (or am I missing something?), so why
return half a tick to the user.


-- 

	Balbir Singh,
	Linux Technology Center,
	IBM Software Labs

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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-01 14:24 ` Balbir Singh
@ 2006-08-01 21:51   ` Jay Lan
  2006-08-02 15:31     ` Shailabh Nagar
  2006-08-07 21:23     ` Jay Lan
  0 siblings, 2 replies; 15+ messages in thread
From: Jay Lan @ 2006-08-01 21:51 UTC (permalink / raw)
  To: balbir
  Cc: Andrew Morton, lkml, Shailabh Nagar, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

Balbir Singh wrote:
> Jay Lan wrote:
> 
>>  
>> -#define TASKSTATS_VERSION    1
>> +#define TASKSTATS_VERSION    2
>> +#define TASK_COMM_LEN        16
>>  
> 
> 
> We should find a way to keep this in sync with with the definition
> in linux/sched.h (won't we a warning if both this header and
> linux/sched.h are included together?)

I do not know how to sync it up. This header linux/taskstats.h is
meant to be included by userspace programs. If an application
happens to include linux/sched.h, which includes linux/time.h,
the application will very likely have compilation errors because
the "struct timespec" declaration in <linux/time.h> and <time.h>
are conflicting.

The <linux/acct.h> defines it to
#define ACCT_COMM    16

I can change our define to TS_COMM_LEN with remakes saying it
should be in sync with the TAKS_COMM_LEN defined in linux/sched.h.

If there is a better way, i am eager to know it.

> 
> 
> 
>> + * 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;
> 
> 
> I think you should use the portable cputime_xxxx() API since
> tsk->utime and tsk->stime are of type cputime_t

Will fix it.

> 
> 
>> +    /* 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;
>> +    }
>> +
> 
> 
> This is confusing. Half tick does not make any sense from the
> scheduler view point (or am I missing something?), so why
> return half a tick to the user.

It must be inherited from old code dated back to Cray UNICOS.
I do not know if bad thing can happen if both utime and stime
are less than 1 usec...  I guess not. But i agree that
half a tick does not make sense. To play safe, we can change
it to 1 usec if both utime and stime are sub microsecond.
What do you think?

Thanks,
  - jay


> 
> 


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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-01 21:51   ` Jay Lan
@ 2006-08-02 15:31     ` Shailabh Nagar
  2006-08-02 17:17       ` Balbir Singh
  2006-08-07 21:23     ` Jay Lan
  1 sibling, 1 reply; 15+ messages in thread
From: Shailabh Nagar @ 2006-08-02 15:31 UTC (permalink / raw)
  To: Jay Lan
  Cc: balbir, Andrew Morton, lkml, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

Jay Lan wrote:
> Balbir Singh wrote:
> 
>> Jay Lan wrote:
>>
>>>  
>>> -#define TASKSTATS_VERSION    1
>>> +#define TASKSTATS_VERSION    2
>>> +#define TASK_COMM_LEN        16
>>>  
>>
>>
>>
>> We should find a way to keep this in sync with with the definition
>> in linux/sched.h (won't we a warning if both this header and
>> linux/sched.h are included together?)
> 
> 
> I do not know how to sync it up. This header linux/taskstats.h is
> meant to be included by userspace programs. If an application
> happens to include linux/sched.h, which includes linux/time.h,
> the application will very likely have compilation errors because
> the "struct timespec" declaration in <linux/time.h> and <time.h>
> are conflicting.
> 
> The <linux/acct.h> defines it to
> #define ACCT_COMM    16
> 
> I can change our define to TS_COMM_LEN with remakes saying it
> should be in sync with the TAKS_COMM_LEN defined in linux/sched.h.

This seems like a good enough way to do it. There's no real need for
the taskstats comm length to remain exactly in sync with the task struct's
comm length (by way of trying to include sched.h etc.) though avoiding the
compile error by renaming is desirable as Balbir pointed out.

Moreover, TASK_COMM_LEN in linux/sched.h isn't likely to change much -
if it increases and csa_acct users also really need the extra info provided,
taskstats can always be changed and version bumped up. If the size decreases
there's no harm done (strncpy should be sufficient protection).

--Shailabh


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

* Re: [patch 1/3] add basic accounting fields to taskstats
  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
  0 siblings, 2 replies; 15+ messages in thread
From: Balbir Singh @ 2006-08-02 17:17 UTC (permalink / raw)
  To: Shailabh Nagar
  Cc: Jay Lan, Andrew Morton, lkml, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

Shailabh Nagar wrote:
> Jay Lan wrote:
>> Balbir Singh wrote:
>>
>>> Jay Lan wrote:
>>>
>>>>  
>>>> -#define TASKSTATS_VERSION    1
>>>> +#define TASKSTATS_VERSION    2
>>>> +#define TASK_COMM_LEN        16
>>>>  
>>>
>>>
>>>
>>> We should find a way to keep this in sync with with the definition
>>> in linux/sched.h (won't we a warning if both this header and
>>> linux/sched.h are included together?)
>>
>>
>> I do not know how to sync it up. This header linux/taskstats.h is
>> meant to be included by userspace programs. If an application
>> happens to include linux/sched.h, which includes linux/time.h,
>> the application will very likely have compilation errors because
>> the "struct timespec" declaration in <linux/time.h> and <time.h>
>> are conflicting.
>>
>> The <linux/acct.h> defines it to
>> #define ACCT_COMM    16
>>
>> I can change our define to TS_COMM_LEN with remakes saying it
>> should be in sync with the TAKS_COMM_LEN defined in linux/sched.h.
> 
> This seems like a good enough way to do it. There's no real need for
> the taskstats comm length to remain exactly in sync with the task struct's
> comm length (by way of trying to include sched.h etc.) though avoiding the
> compile error by renaming is desirable as Balbir pointed out.
> 
> Moreover, TASK_COMM_LEN in linux/sched.h isn't likely to change much -
> if it increases and csa_acct users also really need the extra info 
> provided,
> taskstats can always be changed and version bumped up. If the size 
> decreases
> there's no harm done (strncpy should be sufficient protection).
> 
> --Shailabh
> 

I am not sure if there is a version of BUG_ON() for compile time
asserts. Basically, if we have an infrastructure of the form

/*
  * From C/C++ users journal November 2004
  */
#define STATIC_BUG_ON(e) 	\
	switch (0) {		\
	case  0:		\
	case (e):		\
		;		\
	}

Then the STATIC_BUG_ON() can catch as shown below.

#define TASK_COMM_LEN 	16
#define T_COMM_LEN	20

int
main(void)
{
	STATIC_BUG_ON(TASK_COMM_LEN == T_COMM_LEN);
}

STATIC_BUG_ON gives the following warning

bug_on_c.c: In function `main':
bug_on_c.c:19: duplicate case value
bug_on_c.c:19: previously used here

but with T_COMM_LEN set to 16

It compiles without any errors, the code generated also
looks like it has no overhead

int
main(void)
{
  8048310:       55                      push   %ebp
  8048311:       89 e5                   mov    %esp,%ebp
  8048313:       83 ec 08                sub    $0x8,%esp
  8048316:       83 e4 f0                and    $0xfffffff0,%esp
         STATIC_BUG_ON(TASK_COMM_LEN == T_COMM_LEN);
}
  8048319:       c9                      leave
  804831a:       c3                      ret
  804831b:       90                      nop


Assuming such infrastructure is available, you could then
do

#ifdef __KERNEL__
#include <linux/sched.h>
#define TS_COMM_LEN	16
STATIC_BUG_ON (TS_COMM_LEN == TASK_COMM_LEN);
#endif

Comments?

-- 

	Balbir Singh,
	Linux Technology Center,
	IBM Software Labs

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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-02 17:17       ` Balbir Singh
@ 2006-08-02 17:37         ` Shailabh Nagar
  2006-08-02 21:09         ` Andrew Morton
  1 sibling, 0 replies; 15+ messages in thread
From: Shailabh Nagar @ 2006-08-02 17:37 UTC (permalink / raw)
  To: balbir
  Cc: Jay Lan, Andrew Morton, lkml, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

Balbir Singh wrote:

> 
> I am not sure if there is a version of BUG_ON() for compile time
> asserts. Basically, if we have an infrastructure of the form
> 
> /*
>  * From C/C++ users journal November 2004
>  */
> #define STATIC_BUG_ON(e)     \
>     switch (0) {        \
>     case  0:        \
>     case (e):        \
>         ;        \
>     }
> 
> Then the STATIC_BUG_ON() can catch as shown below.
> 
> #define TASK_COMM_LEN     16
> #define T_COMM_LEN    20
> 
> int
> main(void)
> {
>     STATIC_BUG_ON(TASK_COMM_LEN == T_COMM_LEN);
> }
> 
> STATIC_BUG_ON gives the following warning
> 
> bug_on_c.c: In function `main':
> bug_on_c.c:19: duplicate case value
> bug_on_c.c:19: previously used here
> 
> but with T_COMM_LEN set to 16
> 
> It compiles without any errors, the code generated also
> looks like it has no overhead
> 
> int
> main(void)
> {
>  8048310:       55                      push   %ebp
>  8048311:       89 e5                   mov    %esp,%ebp
>  8048313:       83 ec 08                sub    $0x8,%esp
>  8048316:       83 e4 f0                and    $0xfffffff0,%esp
>         STATIC_BUG_ON(TASK_COMM_LEN == T_COMM_LEN);
> }
>  8048319:       c9                      leave
>  804831a:       c3                      ret
>  804831b:       90                      nop
> 
> 
> Assuming such infrastructure is available, you could then
> do
> 
> #ifdef __KERNEL__
> #include <linux/sched.h>
> #define TS_COMM_LEN    16
> STATIC_BUG_ON (TS_COMM_LEN == TASK_COMM_LEN);
> #endif
> 
> Comments?
> 

Neat trick !
Perhaps STATIC_WARNING is a more appropriate name but
something like this for general use may be good.


--Shailabh

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

* Re: [patch 1/3] add basic accounting fields to taskstats
  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
  1 sibling, 2 replies; 15+ messages in thread
From: Andrew Morton @ 2006-08-02 21:09 UTC (permalink / raw)
  To: balbir
  Cc: Shailabh Nagar, Jay Lan, lkml, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

On Wed, 02 Aug 2006 22:47:07 +0530
Balbir Singh <balbir@in.ibm.com> wrote:

> I am not sure if there is a version of BUG_ON() for compile time
> asserts

We have BUILD_BUG_ON()

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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-02 21:09         ` Andrew Morton
@ 2006-08-02 23:47           ` Jay Lan
  2006-08-03  3:02           ` Balbir Singh
  1 sibling, 0 replies; 15+ messages in thread
From: Jay Lan @ 2006-08-02 23:47 UTC (permalink / raw)
  To: Andrew Morton
  Cc: balbir, Shailabh Nagar, Jay Lan, lkml, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

Andrew Morton wrote:
>On Wed, 02 Aug 2006 22:47:07 +0530
>Balbir Singh <balbir@in.ibm.com> wrote:
>
>  
>>I am not sure if there is a version of BUG_ON() for compile time
>>asserts
>>    
>
>We have BUILD_BUG_ON()
>  

BUILD_BUG_ON() is a statement. I will do that inside bacct_add_tsk().

Thanks,
 - jay


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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-02 21:09         ` Andrew Morton
  2006-08-02 23:47           ` Jay Lan
@ 2006-08-03  3:02           ` Balbir Singh
  1 sibling, 0 replies; 15+ messages in thread
From: Balbir Singh @ 2006-08-03  3:02 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Shailabh Nagar, Jay Lan, lkml, Jes Sorensen, Chris Sturtivant,
	Tony Ernst

Andrew Morton wrote:
> On Wed, 02 Aug 2006 22:47:07 +0530
> Balbir Singh <balbir@in.ibm.com> wrote:
> 
>> I am not sure if there is a version of BUG_ON() for compile time
>> asserts
> 
> We have BUILD_BUG_ON()

Thanks, I remember that we had something similar, but was lost
looking for it in asm-*/bug.h.

-- 

	Balbir Singh,
	Linux Technology Center,
	IBM Software Labs

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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-01 21:51   ` Jay Lan
  2006-08-02 15:31     ` Shailabh Nagar
@ 2006-08-07 21:23     ` Jay Lan
  2006-08-08  5:22       ` Balbir Singh
  1 sibling, 1 reply; 15+ messages in thread
From: Jay Lan @ 2006-08-07 21:23 UTC (permalink / raw)
  To: Jay Lan
  Cc: balbir, Andrew Morton, lkml, Shailabh Nagar, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

Jay Lan wrote:

[snip]

>>
>>
>>> +    /* 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;
>>> +    }
>>> +
>>
>>
>>
>> This is confusing. Half tick does not make any sense from the
>> scheduler view point (or am I missing something?), so why
>> return half a tick to the user.
> 
> 
> It must be inherited from old code dated back to Cray UNICOS.
> I do not know if bad thing can happen if both utime and stime
> are less than 1 usec...  I guess not. But i agree that
> half a tick does not make sense. To play safe, we can change
> it to 1 usec if both utime and stime are sub microsecond.
> What do you think?

Hi Balbir,

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.

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.

Regards,
  - jay


[snip]

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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-07 21:23     ` Jay Lan
@ 2006-08-08  5:22       ` Balbir Singh
  2006-08-08 16:40         ` Jay Lan
  0 siblings, 1 reply; 15+ messages in thread
From: Balbir Singh @ 2006-08-08  5:22 UTC (permalink / raw)
  To: Jay Lan
  Cc: Andrew Morton, lkml, Shailabh Nagar, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

Jay Lan wrote:
> Jay Lan wrote:
> 
> [snip]
> 
>>>
>>>
>>>> +    /* 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;
>>>> +    }
>>>> +
>>>
>>>
>>>
>>> This is confusing. Half tick does not make any sense from the
>>> scheduler view point (or am I missing something?), so why
>>> return half a tick to the user.
>>
>>
>> It must be inherited from old code dated back to Cray UNICOS.
>> I do not know if bad thing can happen if both utime and stime
>> are less than 1 usec...  I guess not. But i agree that
>> half a tick does not make sense. To play safe, we can change
>> it to 1 usec if both utime and stime are sub microsecond.
>> What do you think?
> 
> Hi Balbir,
> 
> 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.


> Regards,
>  - jay
> 
> 
> [snip]


-- 
	Warm Regards,
	Balbir Singh,
	Linux Technology Center,
	IBM Software Labs

^ 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

* Re: [patch 1/3] add basic accounting fields to taskstats
  2006-08-08  5:22       ` Balbir Singh
@ 2006-08-08 16:40         ` Jay Lan
  0 siblings, 0 replies; 15+ messages in thread
From: Jay Lan @ 2006-08-08 16:40 UTC (permalink / raw)
  To: balbir
  Cc: Andrew Morton, lkml, Shailabh Nagar, Jes Sorensen,
	Chris Sturtivant, Tony Ernst

Balbir Singh wrote:
> Jay Lan wrote:
>> Jay Lan wrote:
>>
>> [snip]
>>
>>>>
>>>>
>>>>> +    /* 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;
>>>>> +    }
>>>>> +
>>>>
>>>>
>>>>
>>>> This is confusing. Half tick does not make any sense from the
>>>> scheduler view point (or am I missing something?), so why
>>>> return half a tick to the user.
>>>
>>>
>>> It must be inherited from old code dated back to Cray UNICOS.
>>> I do not know if bad thing can happen if both utime and stime
>>> are less than 1 usec...  I guess not. But i agree that
>>> half a tick does not make sense. To play safe, we can change
>>> it to 1 usec if both utime and stime are sub microsecond.
>>> What do you think?
>>
>> Hi Balbir,
>>
>> 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.

Yes, i will leave them as zero in this case.

Regards,
 - jay

>
>
>> Regards,
>>  - jay
>>
>>
>> [snip]
>
>


^ 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).