summaryrefslogtreecommitdiff
path: root/fs/proc/array.c
diff options
context:
space:
mode:
authorAlbert Cahalan <albert@users.sourceforge.net>2004-10-18 08:54:14 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-10-18 08:54:14 -0700
commitbf719d26a5c1ebe5ceed46f47bebefa4beae1f34 (patch)
tree2c45ef986c8b2ac8afe56d651b81c6ec1ecf5194 /fs/proc/array.c
parent09b9135c6e9950c0f12e3e6993ae52ab1baf0476 (diff)
[PATCH] distinct tgid/tid CPU usage
This patch adjusts /proc/*/stat to have distinct per-process and per-thread CPU usage, faults, and wchan. Signed-off-by: Albert Cahalan <albert@users.sf.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/proc/array.c')
-rw-r--r--fs/proc/array.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c
index d7ee3a838e3f..1b4e86c62487 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -300,9 +300,9 @@ int proc_pid_status(struct task_struct *task, char * buffer)
return buffer - orig;
}
-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 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
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;
unsigned long rsslim = 0;
char tcomm[sizeof(task->comm)];
@@ -326,7 +327,6 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
}
get_task_comm(tcomm, task);
- wchan = get_wchan(task);
sigemptyset(&sigign);
sigemptyset(&sigcatch);
@@ -349,18 +349,30 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
cutime = task->signal->cutime;
cstime = task->signal->cstime;
rsslim = task->signal->rlim[RLIMIT_RSS].rlim_cur;
+ 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 */
/* convert timespec -> nsec*/
start_time = (unsigned long long)task->start_time.tv_sec * NSEC_PER_SEC
@@ -380,12 +392,12 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
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 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
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);
+}
+
int proc_pid_statm(struct task_struct *task, char *buffer)
{
int size = 0, resident = 0, shared = 0, text = 0, lib = 0, data = 0;