distinct tgid/tid CPU usage
PATCH 1/1 distinct tgid/tid CPU usage
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 <[email protected]>
fs/proc/array.c +33 -11
@@ -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) {
fs/proc/base.c +6 -2
@@ -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 :