[PATCH] distinct tgid/tid CPU usage

From: Albert Cahalan
Date: Tue Aug 31 2004 - 17:35:29 EST


This patch adjusts /proc/*/stat to have distinct
per-process and per-thread CPU usage, faults, and
wchan. It should fit the BitKeeper tree as of about
now, following after the two waitid/rusage patches.

Signed-off-by: Albert Cahalan <albert@xxxxxxxxxxxx>

diff -Naurd a/fs/proc/array.c b/fs/proc/array.c
--- a/fs/proc/array.c 2004-08-31 18:08:38.000000000 -0400
+++ b/fs/proc/array.c 2004-08-31 17:55:30.000000000 -0400
@@ -300,9 +300,9 @@
}

extern unsigned long task_vsize(struct mm_struct *);
-int proc_pid_stat(struct task_struct *task, char * buffer)
+static int do_task_stat(struct task_struct *task, char * buffer, int whole)
{
- unsigned long vsize, eip, esp, wchan;
+ unsigned long vsize, eip, esp, wchan = ~0ul;
long priority, nice;
int tty_pgrp = -1, tty_nr = 0;
sigset_t sigign, sigcatch;
@@ -313,6 +313,7 @@
struct mm_struct *mm;
unsigned long long start_time;
unsigned long cmin_flt = 0, cmaj_flt = 0, cutime = 0, cstime = 0;
+ unsigned long min_flt = 0, maj_flt = 0, utime = 0, stime = 0;
char tcomm[sizeof(task->comm)];

state = *get_task_state(task);
@@ -331,7 +332,6 @@
}

get_task_comm(tcomm, task);
- wchan = get_wchan(task);

sigemptyset(&sigign);
sigemptyset(&sigcatch);
@@ -353,18 +353,30 @@
cmaj_flt = task->signal->cmaj_flt;
cutime = task->signal->cutime;
cstime = task->signal->cstime;
+ if (whole) {
+ min_flt = task->signal->min_flt;
+ maj_flt = task->signal->maj_flt;
+ utime = task->signal->utime;
+ stime = task->signal->stime;
+ }
}
+ ppid = task->pid ? task->real_parent->pid : 0;
read_unlock(&tasklist_lock);

+ if (!whole || num_threads<2)
+ wchan = get_wchan(task);
+ if (!whole) {
+ min_flt = task->min_flt;
+ maj_flt = task->maj_flt;
+ utime = task->utime;
+ stime = task->stime;
+ }
+
/* scale priority and nice values from timeslices to -20..20 */
/* to make it look like a "normal" Unix priority/nice value */
priority = task_prio(task);
nice = task_nice(task);

- read_lock(&tasklist_lock);
- ppid = task->pid ? task->real_parent->pid : 0;
- read_unlock(&tasklist_lock);
-
/* Temporary variable needed for gcc-2.96 */
start_time = jiffies_64_to_clock_t(task->start_time - INITIAL_JIFFIES);

@@ -380,12 +392,12 @@
tty_nr,
tty_pgrp,
task->flags,
- task->min_flt,
+ min_flt,
cmin_flt,
- task->maj_flt,
+ maj_flt,
cmaj_flt,
- jiffies_to_clock_t(task->utime),
- jiffies_to_clock_t(task->stime),
+ jiffies_to_clock_t(utime),
+ jiffies_to_clock_t(stime),
jiffies_to_clock_t(cutime),
jiffies_to_clock_t(cstime),
priority,
@@ -421,6 +433,16 @@
return res;
}

+int proc_tid_stat(struct task_struct *task, char * buffer)
+{
+ return do_task_stat(task, buffer, 0);
+}
+
+int proc_tgid_stat(struct task_struct *task, char * buffer)
+{
+ return do_task_stat(task, buffer, 1);
+}
+
extern int task_statm(struct mm_struct *, int *, int *, int *, int *);
int proc_pid_statm(struct task_struct *task, char *buffer)
{
diff -Naurd a/fs/proc/base.c b/fs/proc/base.c
--- a/fs/proc/base.c 2004-08-24 03:02:58.000000000 -0400
+++ b/fs/proc/base.c 2004-08-31 17:33:00.000000000 -0400
@@ -177,7 +177,8 @@
return PROC_I(inode)->type;
}

-int proc_pid_stat(struct task_struct*,char*);
+int proc_tid_stat(struct task_struct*,char*);
+int proc_tgid_stat(struct task_struct*,char*);
int proc_pid_status(struct task_struct*,char*);
int proc_pid_statm(struct task_struct*,char*);

@@ -1320,9 +1321,12 @@
ei->op.proc_read = proc_pid_status;
break;
case PROC_TID_STAT:
+ inode->i_fop = &proc_info_file_operations;
+ ei->op.proc_read = proc_tid_stat;
+ break;
case PROC_TGID_STAT:
inode->i_fop = &proc_info_file_operations;
- ei->op.proc_read = proc_pid_stat;
+ ei->op.proc_read = proc_tgid_stat;
break;
case PROC_TID_CMDLINE:
case PROC_TGID_CMDLINE:



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