summaryrefslogtreecommitdiffstats
path: root/usr.bin/top
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>2006-11-07 10:03:10 +0000
committerbde <bde@FreeBSD.org>2006-11-07 10:03:10 +0000
commit95c27ab84543d6ba156210ab6d05810088b45bdb (patch)
tree4d842ebe0e0758342d5076e14cf6e5969044db21 /usr.bin/top
parentb9e58fd6df40d5bbf4849d4c63f24af7956796d5 (diff)
downloadFreeBSD-src-95c27ab84543d6ba156210ab6d05810088b45bdb.zip
FreeBSD-src-95c27ab84543d6ba156210ab6d05810088b45bdb.tar.gz
Second stage of unbreaking thr formatting of the NICE field: decode the
priority class and use this to: - print "-" instead of a garbage value for ithreads. Print "-" instead of the unused nice value for kthreads which are (mis)classified as PRI_TIMESHARE. For such threads, the nice value can be set to nonzero by root, but it is never used (at least by the 4bsd scheduler). For ithreads, we didn't even print the unused value. - print "i<priority>" and "r<priority>" instead of a biased "<priority>" for idletime and realtime threads, Here <priority> is the priority parameter to idprio/rtprio(1). Just add the prefix and remove the bias for now. <priority> has been stored indirectly in the kernel since 2001/02/12, and even the kernel cannot recover the original value in all cases. Here we need to handle more cases than pri_to_rtp(), but actually handle fewer cases, and end up printing garbage after a thread changes its current priority while in the kernel. - for idletime and realtime threads, if they are kthreads then add a prefix of "k" to the previous string. - for idletime and realtime threads, if they in the FIFO scheduling class then add a suffix of "F" to the previous string (if it fits; the other parts of the string are sure to fit unless <priority> is garbage).
Diffstat (limited to 'usr.bin/top')
-rw-r--r--usr.bin/top/machine.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 92c82fa..d3f9ef0 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -800,22 +800,36 @@ getsysctl(const char *name, void *ptr, size_t len)
}
}
-static
-const char *format_nice(const struct kinfo_proc *pp)
+static const char *
+format_nice(const struct kinfo_proc *pp)
{
- static char nicebuf[5];
-
- snprintf(nicebuf, sizeof(nicebuf), "%4d",
- /*
- * normal time -> nice value -20 - +20
- * real time 0 - 31 -> nice value -52 - -21
- * idle time 0 - 31 -> nice value +21 - +52
- */
- (pp->ki_pri.pri_class == PRI_TIMESHARE ?
- pp->ki_nice - NZERO :
- (PRI_IS_REALTIME(pp->ki_pri.pri_class) ?
- (PRIO_MIN - 1 - (PRI_MAX_REALTIME - pp->ki_pri.pri_level)) :
- (PRIO_MAX + 1 + pp->ki_pri.pri_level - PRI_MIN_IDLE))));
+ const char *fifo, *kthread;
+ int rtpri;
+ static char nicebuf[4 + 1];
+
+ fifo = PRI_NEED_RR(pp->ki_pri.pri_class) ? "" : "F";
+ kthread = (pp->ki_flag & P_KTHREAD) ? "k" : "";
+ switch (PRI_BASE(pp->ki_pri.pri_class)) {
+ case PRI_ITHD:
+ return ("-");
+ case PRI_REALTIME:
+ rtpri = pp->ki_pri.pri_level - PRI_MIN_REALTIME;
+ snprintf(nicebuf, sizeof(nicebuf), "%sr%d%s",
+ kthread, rtpri, fifo);
+ break;
+ case PRI_TIMESHARE:
+ if (pp->ki_flag & P_KTHREAD)
+ return ("-");
+ snprintf(nicebuf, sizeof(nicebuf), "%d", pp->ki_nice - NZERO);
+ break;
+ case PRI_IDLE:
+ rtpri = pp->ki_pri.pri_level - PRI_MIN_IDLE;
+ snprintf(nicebuf, sizeof(nicebuf), "%si%d%s",
+ kthread, rtpri, fifo);
+ break;
+ default:
+ return ("?");
+ }
return (nicebuf);
}
OpenPOWER on IntegriCloud