proc->thread stage 3: synchronize ps, top, and libkvm, and add some convenience
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 23 Jun 2003 23:53:01 +0000 (23:53 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 23 Jun 2003 23:53:01 +0000 (23:53 +0000)
fields to eproc in the kernel to help them along.

bin/ps/keyword.c
bin/ps/print.c
lib/libkvm/kvm_proc.c
sys/kern/kern_proc.c
sys/sys/user.h
usr.bin/top/machine.c

index f69c35b..a2db7a2 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)keyword.c       8.5 (Berkeley) 4/2/94
  * $FreeBSD: src/bin/ps/keyword.c,v 1.24.2.3 2002/10/10 20:05:32 jmallett Exp $
- * $DragonFly: src/bin/ps/keyword.c,v 1.2 2003/06/17 04:22:50 dillon Exp $
+ * $DragonFly: src/bin/ps/keyword.c,v 1.3 2003/06/23 23:52:57 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -139,7 +139,7 @@ VAR var[] = {
                NULL, 0, evar, NULL, PIDLEN, EOFF(e_ppid), UINT, PIDFMT},
        {"pri", "PRI", NULL, 0, pri, NULL, 3},
        {"re", "RE", NULL, 0, pvar, NULL, 3, POFF(p_swtime), UINT, "d"},
-       {"rgid", "RGID", NULL, 0, evar, NULL, UIDLEN, EOFF(e_pcred.p_rgid),
+       {"rgid", "RGID", NULL, 0, evar, NULL, UIDLEN, EOFF(e_ucred.cr_rgid),
                UINT, UIDFMT},
        {"rlink", "RLINK",
                NULL, 0, pvar, NULL, 8, POFF(p_procq.tqe_prev), KPTR, "lx"},
@@ -147,7 +147,7 @@ VAR var[] = {
        {"rssize", "", "rsz"},
        {"rsz", "RSZ", NULL, 0, rssize, NULL, 4},
        {"rtprio", "RTPRIO", NULL, 0, rtprior, NULL, 7, POFF(p_rtprio)},
-       {"ruid", "RUID", NULL, 0, evar, NULL, UIDLEN, EOFF(e_pcred.p_ruid),
+       {"ruid", "RUID", NULL, 0, evar, NULL, UIDLEN, EOFF(e_ucred.cr_ruid),
                UINT, UIDFMT},
        {"ruser", "RUSER", NULL, LJUST|DSIZ, runame, s_runame, USERLEN},
        {"sess", "SESS", NULL, 0, evar, NULL, 6, EOFF(e_sess), KPTR, "lx"},
@@ -163,9 +163,9 @@ VAR var[] = {
        {"stat", "", "state"},
        {"state", "STAT", NULL, 0, state, NULL, 4},
        {"svgid", "SVGID", NULL, 0,
-               evar, NULL, UIDLEN, EOFF(e_pcred.p_svgid), UINT, UIDFMT},
+               evar, NULL, UIDLEN, EOFF(e_ucred.cr_svgid), UINT, UIDFMT},
        {"svuid", "SVUID", NULL, 0,
-               evar, NULL, UIDLEN, EOFF(e_pcred.p_svuid), UINT, UIDFMT},
+               evar, NULL, UIDLEN, EOFF(e_ucred.cr_svuid), UINT, UIDFMT},
        {"tdev", "TDEV", NULL, 0, tdev, NULL, 4},
        {"time", "TIME", NULL, USER, cputime, NULL, 9},
        {"tpgid", "TPGID",
index 981fe43..333a797 100644 (file)
@@ -32,7 +32,7 @@
  *
  * @(#)print.c 8.6 (Berkeley) 4/16/94
  * $FreeBSD: src/bin/ps/print.c,v 1.36.2.4 2002/11/30 13:00:14 tjr Exp $
- * $DragonFly: src/bin/ps/print.c,v 1.2 2003/06/17 04:22:50 dillon Exp $
+ * $DragonFly: src/bin/ps/print.c,v 1.3 2003/06/23 23:52:57 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -274,14 +274,14 @@ runame(k, ve)
 
        v = ve->var;
        (void)printf("%-*s",
-           (int)v->width, user_from_uid(KI_EPROC(k)->e_pcred.p_ruid, 0));
+           (int)v->width, user_from_uid(KI_EPROC(k)->e_ucred.cr_ruid, 0));
 }
 
 int
 s_runame(k)
        KINFO *k;
 {
-           return (strlen(user_from_uid(KI_EPROC(k)->e_pcred.p_ruid, 0)));
+           return (strlen(user_from_uid(KI_EPROC(k)->e_ucred.cr_ruid, 0)));
 }
 
 void
@@ -475,13 +475,16 @@ cputime(k, ve)
                secs = 0;
                psecs = 0;
        } else {
+               u_int64_t timeus;
+
                /*
                 * This counts time spent handling interrupts.  We could
                 * fix this, but it is not 100% trivial (and interrupt
                 * time fractions only work on the sparc anyway).       XXX
                 */
-               secs = KI_PROC(k)->p_runtime / 1000000;
-               psecs = KI_PROC(k)->p_runtime % 1000000;
+               timeus = KI_EPROC(k)->e_uticks + KI_EPROC(k)->e_sticks;
+               secs = timeus / 1000000;
+               psecs = timeus % 1000000;
                if (sumrusage) {
                        secs += k->ki_u.u_cru.ru_utime.tv_sec +
                                k->ki_u.u_cru.ru_stime.tv_sec;
index d287eaa..e562afc 100644 (file)
@@ -35,7 +35,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libkvm/kvm_proc.c,v 1.25.2.3 2002/08/24 07:27:46 kris Exp $
- * $DragonFly: src/lib/libkvm/kvm_proc.c,v 1.2 2003/06/17 04:26:49 dillon Exp $
+ * $DragonFly: src/lib/libkvm/kvm_proc.c,v 1.3 2003/06/23 23:53:01 dillon Exp $
  *
  * @(#)kvm_proc.c      8.3 (Berkeley) 9/23/93
  */
@@ -117,9 +117,7 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
                        _kvm_err(kd, kd->program, "can't read proc at %x", p);
                        return (-1);
                }
-               if (KREAD(kd, (u_long)proc.p_cred, &eproc.e_pcred) == 0)
-                       (void)(KREAD(kd, (u_long)eproc.e_pcred.pc_ucred,
-                                    &eproc.e_ucred));
+               KREAD(kd, (u_long)proc.p_ucred, &eproc.e_ucred);
 
                switch(what) {
 
@@ -134,7 +132,7 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
                        break;
 
                case KERN_PROC_RUID:
-                       if (eproc.e_pcred.p_ruid != (uid_t)arg)
+                       if (eproc.e_ucred.cr_ruid != (uid_t)arg)
                                continue;
                        break;
                }
index 530c27e..4764ed9 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)kern_proc.c 8.7 (Berkeley) 2/14/95
  * $FreeBSD: src/sys/kern/kern_proc.c,v 1.63.2.9 2003/05/08 07:47:16 kbyanc Exp $
- * $DragonFly: src/sys/kern/kern_proc.c,v 1.4 2003/06/23 17:55:41 dillon Exp $
+ * $DragonFly: src/sys/kern/kern_proc.c,v 1.5 2003/06/23 23:52:54 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -362,6 +362,9 @@ fill_eproc(p, ep)
        bzero(ep, sizeof(*ep));
 
        ep->e_paddr = p;
+       ep->e_uticks = p->p_thread->td_uticks;
+       ep->e_sticks = p->p_thread->td_sticks;
+       ep->e_iticks = p->p_thread->td_iticks;
        if (p->p_ucred) {
                ep->e_ucred = *p->p_ucred;
        }
index 8a6ce96..868ac3e 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)user.h      8.2 (Berkeley) 9/23/93
  * $FreeBSD: src/sys/sys/user.h,v 1.24.2.1 2001/10/11 08:20:18 peter Exp $
- * $DragonFly: src/sys/sys/user.h,v 1.4 2003/06/23 17:55:50 dillon Exp $
+ * $DragonFly: src/sys/sys/user.h,v 1.5 2003/06/23 23:52:51 dillon Exp $
  */
 
 #ifndef _SYS_USER_H_
@@ -72,6 +72,9 @@ struct kinfo_proc {
                struct  procsig e_procsig;      /* shared signal structure */
                struct  vmspace e_vm;           /* address space */
                struct  pstats e_stats;         /* process stats */
+               u_int64_t e_uticks;             /* time accouting */
+               u_int64_t e_sticks;
+               u_int64_t e_iticks;
                pid_t   e_ppid;                 /* parent process id */
                pid_t   e_pgid;                 /* process group id */
                short   e_jobc;                 /* job control counter */
index 8d7752b..374c518 100644 (file)
@@ -20,7 +20,7 @@
  *          Wolfram Schneider <wosch@FreeBSD.org>
  *
  * $FreeBSD: src/usr.bin/top/machine.c,v 1.29.2.2 2001/07/31 20:27:05 tmm Exp $
- * $DragonFly: src/usr.bin/top/machine.c,v 1.2 2003/06/17 04:29:33 dillon Exp $
+ * $DragonFly: src/usr.bin/top/machine.c,v 1.3 2003/06/23 23:52:59 dillon Exp $
  */
 
 
@@ -512,7 +512,7 @@ int (*compare)();
            if ((PP(pp, p_stat) != SZOMB) &&
                (show_idle || (PP(pp, p_pctcpu) != 0) || 
                 (PP(pp, p_stat) == SRUN)) &&
-               (!show_uid || EP(pp, e_pcred.p_ruid) == (uid_t)sel->uid))
+               (!show_uid || EP(pp, e_ucred.cr_ruid) == (uid_t)sel->uid))
            {
                *prefp++ = pp;
                active_procs++;
@@ -544,9 +544,9 @@ caddr_t handle;
 char *(*get_userid)();
 
 {
-    register struct kinfo_proc *pp;
-    register long cputime;
-    register double pct;
+    struct kinfo_proc *pp;
+    long cputime;
+    double pct;
     struct handle *hp;
     char status[16];
     int state;
@@ -577,7 +577,7 @@ char *(*get_userid)();
      * time includes the interrupt time although that is not wanted here.
      * ps(1) is similarly sloppy.
      */
-    cputime = (PP(pp, p_runtime) + 500000) / 1000000;
+    cputime = (EP(pp, e_uticks) + EP(pp, e_sticks)) / 1000000;
 
     /* calculate the base for cpu percentages */
     pct = pctdouble(PP(pp, p_pctcpu));
@@ -611,7 +611,7 @@ char *(*get_userid)();
            smpmode ? smp_Proc_format : up_Proc_format,
            PP(pp, p_pid),
            namelength, namelength,
-           (*get_userid)(EP(pp, e_pcred.p_ruid)),
+           (*get_userid)(EP(pp, e_ucred.cr_ruid)),
            PP(pp, p_priority) - PZERO,
 
            /*
@@ -738,9 +738,11 @@ static unsigned char sorted_state[] =
   if (lresult = (long) PP(p2, p_pctcpu) - (long) PP(p1, p_pctcpu), \
      (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0)
 
+#define CPTICKS(p)     (EP(p, e_uticks) + EP(p, e_sticks))
+
 #define ORDERKEY_CPTICKS \
-  if ((result = PP(p2, p_runtime) > PP(p1, p_runtime) ? 1 : \
-                PP(p2, p_runtime) < PP(p1, p_runtime) ? -1 : 0) == 0)
+  if ((result = CPTICKS(p2) > CPTICKS(p1) ? 1 : \
+               CPTICKS(p2) < CPTICKS(p1) ? -1 : 0) == 0)
 
 #define ORDERKEY_STATE \
   if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] - \
@@ -944,7 +946,7 @@ int pid;
        pp = *prefp++;  
        if (PP(pp, p_pid) == (pid_t)pid)
        {
-           return((int)EP(pp, e_pcred.p_ruid));
+           return((int)EP(pp, e_ucred.cr_ruid));
        }
     }
     return(-1);