Re: ps axH per-thread usage times

2012-04-12 Thread Paul Irofti
Now with libkvm bits as well. Okay?


Index: sys/sys/sysctl.h
===
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.122
diff -u -p -r1.122 sysctl.h
--- sys/sys/sysctl.h10 Apr 2012 15:50:52 -  1.122
+++ sys/sys/sysctl.h12 Apr 2012 14:03:34 -
@@ -466,7 +466,7 @@ struct kinfo_proc {
 
 #define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
 
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa, isthread) \
 do {   \
memset((kp), 0, sizeof(*(kp))); \
\
@@ -498,15 +498,24 @@ do {  
\
(kp)-p_jobc = (pg)-pg_jobc;   \
\
(kp)-p_estcpu = (p)-p_estcpu; \
-   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
-   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   if (isthread) { \
+   (kp)-p_rtime_sec = (p)-p_tu.tu_runtime.tv_sec;\
+   (kp)-p_rtime_usec = (p)-p_tu.tu_runtime.tv_usec;  \
+   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
+   (kp)-p_uticks = (p)-p_tu.tu_uticks;   \
+   (kp)-p_sticks = (p)-p_tu.tu_sticks;   \
+   (kp)-p_iticks = (p)-p_tu.tu_iticks;   \
+   } else {\
+   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
+   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   (kp)-p_tid = -1;   \
+   (kp)-p_uticks = (pr)-ps_tu.tu_uticks; \
+   (kp)-p_sticks = (pr)-ps_tu.tu_sticks; \
+   (kp)-p_iticks = (pr)-ps_tu.tu_iticks; \
+   }   \
(kp)-p_cpticks = (p)-p_cpticks;   \
(kp)-p_pctcpu = (p)-p_pctcpu; \
\
-   (kp)-p_uticks = (p)-p_uticks; \
-   (kp)-p_sticks = (p)-p_sticks; \
-   (kp)-p_iticks = (p)-p_iticks; \
-   \
(kp)-p_tracep = PTRTOINT64((pr)-ps_tracevp);  \
(kp)-p_traceflag = (pr)-ps_traceflag; \
\
@@ -587,7 +596,6 @@ do {
\
}   \
\
(kp)-p_cpuid = KI_NOCPU;   \
-   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
(kp)-p_rtableid = (pr)-ps_rtableid;   \
 } while (0)
 
@@ -933,7 +941,7 @@ int sysctl_dopool(int *, u_int, char *, 
 void fill_file2(struct kinfo_file2 *, struct file *, struct filedesc *,
 int, struct vnode *, struct proc *, struct proc *);
 
-void fill_kproc(struct proc *, struct kinfo_proc *);
+void fill_kproc(struct proc *, struct kinfo_proc *, int);
 
 int kern_sysctl(int *, u_int, void *, size_t *, void *, size_t,
 struct proc *);
Index: sys/kern/kern_sysctl.c
===
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.219
diff -u -p -r1.219 kern_sysctl.c
--- sys/kern/kern_sysctl.c  10 Apr 2012 15:50:52 -  1.219
+++ sys/kern/kern_sysctl.c  12 Apr 2012 14:03:34 -
@@ -1458,8 +1458,20 @@ again:
goto err;
}
 
+   if ((p-p_flag  P_THREAD) == 0) {
+   if (buflen = elem_size  elem_count  0) {
+   fill_kproc(p, kproc, 0);
+   error = copyout(kproc, dp, elem_size);
+   if (error)
+   goto err;
+   dp += elem_size;
+   buflen -= elem_size;
+   elem_count--;
+   }
+   needed += elem_size;
+   }
 

ps axH per-thread usage times

2012-04-11 Thread Paul Irofti
This displayes usage times per thread.

For the main thread it displays the total time (as it did in the past)
and puts marks the TID as -1.

Okay? Should I expand the manpage bits for ps(1)? Currently it says:

.It Fl H
Also display information about kernel visible threads.

EXAMPLE

$ ps axH   
  PID TID TT  STAT   TIME COMMAND
[--snip--]
13449 1026043 p3  I+  0:00.03 firefox
13449 1029081 p3  I+  0:00.03 firefox
13449 1008267 p3  I+  0:00.02 firefox
13449 1021695 p3  I+  0:00.01 firefox
13449  -1 p3  S+  0:04.07 firefox
13449 1013449 p3  S+  0:03.70 firefox
13449 1029858 p3  I+  0:00.00 firefox
13449 1005221 p3  I+  0:00.00 firefox
13449 1022364 p3  I+  0:00.01 firefox
13449 1032468 p3  I+  0:00.03 firefox
13449 1010551 p3  I+  0:00.01 firefox
13449 1016943 p3  I+  0:00.02 firefox
13449 1022871 p3  I+  0:00.02 firefox
13449 1021688 p3  I+  0:00.00 firefox
13449 1028757 p3  I+  0:00.01 firefox
13449 1024286 p3  I+  0:00.01 firefox
13449 1005207 p3  I+  0:00.02 firefox
13449 1021471 p3  S+  0:00.02 firefox
13449 1006822 p3  I+  0:00.04 firefox
13449 1025675 p3  I+  0:00.01 firefox
[--snip--]



Index: sys/sysctl.h
===
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.122
diff -u -p -r1.122 sysctl.h
--- sys/sysctl.h10 Apr 2012 15:50:52 -  1.122
+++ sys/sysctl.h11 Apr 2012 13:29:04 -
@@ -466,7 +466,7 @@ struct kinfo_proc {
 
 #define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
 
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa, isthread) \
 do {   \
memset((kp), 0, sizeof(*(kp))); \
\
@@ -498,8 +498,15 @@ do {   
\
(kp)-p_jobc = (pg)-pg_jobc;   \
\
(kp)-p_estcpu = (p)-p_estcpu; \
-   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
-   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   if ((isthread)) {   \
+   (kp)-p_rtime_sec = (p)-p_tu.tu_runtime.tv_sec;\
+   (kp)-p_rtime_usec = (p)-p_tu.tu_runtime.tv_usec;  \
+   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
+   } else {\
+   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
+   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   (kp)-p_tid = -1;   \
+   }   \
(kp)-p_cpticks = (p)-p_cpticks;   \
(kp)-p_pctcpu = (p)-p_pctcpu; \
\
@@ -587,7 +594,6 @@ do {
\
}   \
\
(kp)-p_cpuid = KI_NOCPU;   \
-   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
(kp)-p_rtableid = (pr)-ps_rtableid;   \
 } while (0)
 
@@ -933,7 +939,7 @@ int sysctl_dopool(int *, u_int, char *, 
 void fill_file2(struct kinfo_file2 *, struct file *, struct filedesc *,
 int, struct vnode *, struct proc *, struct proc *);
 
-void fill_kproc(struct proc *, struct kinfo_proc *);
+void fill_kproc(struct proc *, struct kinfo_proc *, int);
 
 int kern_sysctl(int *, u_int, void *, size_t *, void *, size_t,
 struct proc *);
Index: kern/kern_sysctl.c
===
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.219
diff -u -p -r1.219 kern_sysctl.c
--- kern/kern_sysctl.c  10 Apr 2012 15:50:52 -  1.219
+++ kern/kern_sysctl.c  11 Apr 2012 13:29:05 -
@@ -1458,8 +1458,20 @@ again:
goto err;
}
 
+   if ((p-p_flag  P_THREAD) == 0) {
+   if (buflen = elem_size  elem_count  0) {
+   fill_kproc(p, kproc, 0);
+  

Re: ps axH per-thread usage times

2012-04-11 Thread Philip Guenther
On Wed, Apr 11, 2012 at 6:37 AM, Paul Irofti piro...@cvs.openbsd.org wrote:
 This displayes usage times per thread.

 For the main thread it displays the total time (as it did in the past)
 and puts marks the TID as -1.

Chatting about this we've agreed that with the -H flag, ps (and top)
should only show the lines for the threads (and thus hide the TID=-1
line), while without the -H flag it should only show the process line
(and thus hide the TID=-1 lines, *including* the line for the main
thread).  That way, ps w/o -H behaves as expected with one line per
process, while with -H you get exactly one line per thread.

The only caveat is that the usage values for the process are not
*just* the roll-up of the values for the individual threads: if any
threads have exited, their accumulation will be in the process total,
but they'll no longer show in the -H output.  Overall, the output will
probably better match expectations, however.


Philip Guenther



Re: ps axH per-thread usage times

2012-04-11 Thread Paul Irofti
Updated the diff and included the ps(1) and top(1) bits.


Index: sys/kern/kern_sysctl.c
===
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.219
diff -u -p -r1.219 kern_sysctl.c
--- sys/kern/kern_sysctl.c  10 Apr 2012 15:50:52 -  1.219
+++ sys/kern/kern_sysctl.c  11 Apr 2012 14:31:14 -
@@ -1458,8 +1458,20 @@ again:
goto err;
}
 
+   if ((p-p_flag  P_THREAD) == 0) {
+   if (buflen = elem_size  elem_count  0) {
+   fill_kproc(p, kproc, 0);
+   error = copyout(kproc, dp, elem_size);
+   if (error)
+   goto err;
+   dp += elem_size;
+   buflen -= elem_size;
+   elem_count--;
+   }
+   needed += elem_size;
+   }
if (buflen = elem_size  elem_count  0) {
-   fill_kproc(p, kproc);
+   fill_kproc(p, kproc, 1);
error = copyout(kproc, dp, elem_size);
if (error)
goto err;
@@ -1467,7 +1479,6 @@ again:
buflen -= elem_size;
elem_count--;
}
-   needed += elem_size;
}
if (doingzomb == 0) {
p = LIST_FIRST(zombproc);
@@ -1494,7 +1505,7 @@ err:
  * Fill in a kproc structure for the specified process.
  */
 void
-fill_kproc(struct proc *p, struct kinfo_proc *ki)
+fill_kproc(struct proc *p, struct kinfo_proc *ki, int isthread)
 {
struct process *pr = p-p_p;
struct session *s = pr-ps_session;
@@ -1502,7 +1513,7 @@ fill_kproc(struct proc *p, struct kinfo_
struct timeval ut, st;
 
FILL_KPROC(ki, strlcpy, p, pr, p-p_cred, p-p_ucred, pr-ps_pgrp,
-   p, pr, s, p-p_vmspace, pr-ps_limit, p-p_sigacts);
+   p, pr, s, p-p_vmspace, pr-ps_limit, p-p_sigacts, isthread);
 
/* stuff that's too painful to generalize into the macros */
ki-p_pid = pr-ps_pid;
Index: sys/sys/sysctl.h
===
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.122
diff -u -p -r1.122 sysctl.h
--- sys/sys/sysctl.h10 Apr 2012 15:50:52 -  1.122
+++ sys/sys/sysctl.h11 Apr 2012 14:31:14 -
@@ -466,7 +466,7 @@ struct kinfo_proc {
 
 #define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
 
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa, isthread) \
 do {   \
memset((kp), 0, sizeof(*(kp))); \
\
@@ -498,15 +498,24 @@ do {  
\
(kp)-p_jobc = (pg)-pg_jobc;   \
\
(kp)-p_estcpu = (p)-p_estcpu; \
-   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
-   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   if ((isthread)) {   \
+   (kp)-p_rtime_sec = (p)-p_tu.tu_runtime.tv_sec;\
+   (kp)-p_rtime_usec = (p)-p_tu.tu_runtime.tv_usec;  \
+   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
+   (kp)-p_uticks = (p)-p_tu.tu_uticks;   \
+   (kp)-p_sticks = (p)-p_tu.tu_sticks;   \
+   (kp)-p_iticks = (p)-p_tu.tu_iticks;   \
+   } else {\
+   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
+   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   (kp)-p_tid = -1;   \
+   (kp)-p_uticks = (pr)-ps_tu.tu_uticks; \
+   (kp)-p_sticks = (pr)-ps_tu.tu_sticks; \
+   (kp)-p_iticks = (pr)-ps_tu.tu_iticks; \
+   }   \
(kp)-p_cpticks = (p)-p_cpticks;   \
(kp)-p_pctcpu = (p)-p_pctcpu; \
\
-   (kp)-p_uticks = (p)-p_uticks; \
-   (kp)-p_sticks = (p)-p_sticks; \
-   

Re: ps axH per-thread usage times

2012-04-11 Thread Paul Irofti
 From piro...@cvs.openbsd.org Wed Apr 11 08:36:38 2012
 Date: Wed, 11 Apr 2012 08:36:38 -0600 (MDT)
 From: Paul Irofti piro...@cvs.openbsd.org
 To: guent...@gmail.com, piro...@cvs.openbsd.org
 Subject: Re: ps axH per-thread usage times
 Cc: tech@openbsd.org

 Updated the diff and included the ps(1) and top(1) bits.

Added pkill and documentation bits.


Index: sys/sys/sysctl.h
===
RCS file: /cvs/src/sys/sys/sysctl.h,v
retrieving revision 1.122
diff -u -p -r1.122 sysctl.h
--- sys/sys/sysctl.h10 Apr 2012 15:50:52 -  1.122
+++ sys/sys/sysctl.h11 Apr 2012 16:03:38 -
@@ -466,7 +466,7 @@ struct kinfo_proc {
 
 #define PTRTOINT64(_x) ((u_int64_t)(u_long)(_x))
 
-#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa) \
+#define FILL_KPROC(kp, copy_str, p, pr, pc, uc, pg, paddr, praddr, sess, vm, 
lim, sa, isthread) \
 do {   \
memset((kp), 0, sizeof(*(kp))); \
\
@@ -498,15 +498,24 @@ do {  
\
(kp)-p_jobc = (pg)-pg_jobc;   \
\
(kp)-p_estcpu = (p)-p_estcpu; \
-   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
-   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   if (isthread) { \
+   (kp)-p_rtime_sec = (p)-p_tu.tu_runtime.tv_sec;\
+   (kp)-p_rtime_usec = (p)-p_tu.tu_runtime.tv_usec;  \
+   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
+   (kp)-p_uticks = (p)-p_tu.tu_uticks;   \
+   (kp)-p_sticks = (p)-p_tu.tu_sticks;   \
+   (kp)-p_iticks = (p)-p_tu.tu_iticks;   \
+   } else {\
+   (kp)-p_rtime_sec = (pr)-ps_tu.tu_runtime.tv_sec;  \
+   (kp)-p_rtime_usec = (pr)-ps_tu.tu_runtime.tv_usec;\
+   (kp)-p_tid = -1;   \
+   (kp)-p_uticks = (pr)-ps_tu.tu_uticks; \
+   (kp)-p_sticks = (pr)-ps_tu.tu_sticks; \
+   (kp)-p_iticks = (pr)-ps_tu.tu_iticks; \
+   }   \
(kp)-p_cpticks = (p)-p_cpticks;   \
(kp)-p_pctcpu = (p)-p_pctcpu; \
\
-   (kp)-p_uticks = (p)-p_uticks; \
-   (kp)-p_sticks = (p)-p_sticks; \
-   (kp)-p_iticks = (p)-p_iticks; \
-   \
(kp)-p_tracep = PTRTOINT64((pr)-ps_tracevp);  \
(kp)-p_traceflag = (pr)-ps_traceflag; \
\
@@ -587,7 +596,6 @@ do {
\
}   \
\
(kp)-p_cpuid = KI_NOCPU;   \
-   (kp)-p_tid = (p)-p_pid + THREAD_PID_OFFSET;   \
(kp)-p_rtableid = (pr)-ps_rtableid;   \
 } while (0)
 
@@ -933,7 +941,7 @@ int sysctl_dopool(int *, u_int, char *, 
 void fill_file2(struct kinfo_file2 *, struct file *, struct filedesc *,
 int, struct vnode *, struct proc *, struct proc *);
 
-void fill_kproc(struct proc *, struct kinfo_proc *);
+void fill_kproc(struct proc *, struct kinfo_proc *, int);
 
 int kern_sysctl(int *, u_int, void *, size_t *, void *, size_t,
 struct proc *);
Index: sys/kern/kern_sysctl.c
===
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
retrieving revision 1.219
diff -u -p -r1.219 kern_sysctl.c
--- sys/kern/kern_sysctl.c  10 Apr 2012 15:50:52 -  1.219
+++ sys/kern/kern_sysctl.c  11 Apr 2012 16:03:38 -
@@ -1458,8 +1458,20 @@ again:
goto err;
}
 
+   if ((p-p_flag  P_THREAD) == 0) {
+   if (buflen = elem_size  elem_count  0) {
+   fill_kproc(p, kproc, 0);
+   error = copyout(kproc, dp, elem_size