mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Jay Lan <jlan@sgi.com>
To: Shailabh Nagar <nagar@watson.ibm.com>
Cc: Andrew Morton <akpm@osdl.org>,
	lkml <linux-kernel@vger.kernel.org>,
	Balbir Singh <balbir@in.ibm.com>, Jes Sorensen <jes@sgi.com>,
	Chris Sturtivant <csturtiv@sgi.com>, Tony Ernst <tee@sgi.com>
Subject: Re: [patch 1/3] add basic accounting fields to taskstats
Date: Mon, 31 Jul 2006 14:50:06 -0700	[thread overview]
Message-ID: <44CE7B0E.30805@sgi.com> (raw)
In-Reply-To: <44CE66C3.7020804@watson.ibm.com>

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


  reply	other threads:[~2006-07-31 21:50 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-31 19:20 Jay Lan
2006-07-31 20:23 ` Shailabh Nagar
2006-07-31 21:50   ` Jay Lan [this message]
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
2006-08-08 14:57 Al Boldi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44CE7B0E.30805@sgi.com \
    --to=jlan@sgi.com \
    --cc=akpm@osdl.org \
    --cc=balbir@in.ibm.com \
    --cc=csturtiv@sgi.com \
    --cc=jes@sgi.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nagar@watson.ibm.com \
    --cc=tee@sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome