Do not use KERN_PROC_PROC with kvm_getproc(3); instead, if only process

(and not thread) scope is to be displayed, use KERN_PROC_ALL and
accrue CPU% ourselves, as the kernel makes no attempt to do so.

Of course, this doesn't make most stats any less bogus when displaying
threaded processes, but at least the CPU time is added up and not just
always 0.00%.  There are still issues with SCHED_ULE in top(1) that
cause other processes to display 0.00% CPU when they in fact have used
more.
This commit is contained in:
Brian Feldman 2004-06-06 19:59:06 +00:00
parent 30e2462c71
commit cac4b14c12

View File

@ -405,6 +405,7 @@ int (*compare)();
register int active_procs;
register struct kinfo_proc **prefp;
register struct kinfo_proc *pp;
struct kinfo_proc *prev_pp = NULL;
/* these are copied out of sel for speed */
int show_idle;
@ -414,8 +415,7 @@ int (*compare)();
int show_command;
pbase = kvm_getprocs(kd, sel->thread ? KERN_PROC_ALL : KERN_PROC_PROC,
0, &nproc);
pbase = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc);
if (nproc > onproc)
pref = (struct kinfo_proc **) realloc(pref, sizeof(struct kinfo_proc *)
* (onproc = nproc));
@ -457,8 +457,21 @@ int (*compare)();
(pp->ki_stat == SRUN)) &&
(!show_uid || pp->ki_ruid == (uid_t)sel->uid))
{
*prefp++ = pp;
active_procs++;
/*
* When not showing threads, take the first thread
* for output and add the fields that we can from
* the rest of the process's threads rather than
* using the system's mostly-broken KERN_PROC_PROC.
*/
if (sel->thread || prev_pp == NULL ||
prev_pp->ki_pid != pp->ki_pid)
{
*prefp++ = pp;
active_procs++;
prev_pp = pp;
} else {
prev_pp->ki_pctcpu += pp->ki_pctcpu;
}
}
}
}