Re: ps axH per-thread usage times
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
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
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
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
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