From bf719d26a5c1ebe5ceed46f47bebefa4beae1f34 Mon Sep 17 00:00:00 2001 From: Albert Cahalan Date: Mon, 18 Oct 2004 08:54:14 -0700 Subject: [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 Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- fs/proc/array.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) (limited to 'fs/proc/array.c') 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; -- cgit v1.2.3