Introduce sysputpage() to display large page size with human readable format.

Using UI units allows to fit larger numbers in columns.
Stop calling v_page_size - this is a value that doesn't change at runtime.
Renamed WINDOW *wnd to *wd to avoid conflict with global *wnd variable.
Use bit-shift to convert page size to byte.

PR:             246458
Submitted by:   ota@j.email.ne.jp
MFC after: 2 weeks
Differential Revision:  D24834
This commit is contained in:
Michael Reifenberger 2020-05-15 17:37:08 +00:00
parent 8a68ae80f6
commit 9a8fc6bba3
4 changed files with 71 additions and 28 deletions

View File

@ -165,8 +165,11 @@ void showtcp(void);
void status(void);
void suspend(int);
char *sysctl_dynread(const char *, size_t *);
void sysputpage(WINDOW* , int, int, int, uint64_t, int);
void sysputspaces(WINDOW* , int, int, int);
void sysputstrs(WINDOW* , int, int, int);
void sysputuint64(WINDOW* , int, int, int, uint64_t, int);
void sysputwuint64(WINDOW* , int, int, int, uint64_t, int);
#define SYSTAT_CMD(name) \
void close ## name(WINDOW *); \

View File

@ -60,9 +60,11 @@ kvm_ckread(void *a, void *b, int l)
return (1);
}
void getsysctl(const char *name, void *ptr, size_t len)
void
getsysctl(const char *name, void *ptr, size_t len)
{
size_t nlen = len;
if (sysctlbyname(name, ptr, &nlen, NULL, 0) != 0) {
error("sysctl(%s...) failed: %s", name,
strerror(errno));

View File

@ -41,7 +41,15 @@ __FBSDID("$FreeBSD$");
#include "extern.h"
void
sysputstrs(WINDOW *wnd, int row, int col, int width)
sysputspaces(WINDOW *wd, int row, int col, int width)
{
static char str40[] = " ";
mvwaddstr(wd, row, col, str40 + sizeof(str40) - width - 1);
}
void
sysputstrs(WINDOW *wd, int row, int col, int width)
{
static char str40[] = "****************************************";
@ -49,7 +57,7 @@ sysputstrs(WINDOW *wnd, int row, int col, int width)
}
void
sysputuint64(WINDOW *wnd, int row, int col, int width, uint64_t val, int flags)
sysputuint64(WINDOW *wd, int row, int col, int width, uint64_t val, int flags)
{
char unit, *ptr, *start, wrtbuf[width + width + 1];
int len;
@ -69,9 +77,42 @@ sysputuint64(WINDOW *wnd, int row, int col, int width, uint64_t val, int flags)
memset(wrtbuf + len, ' ', width - len);
start += len;
mvwaddstr(wnd, row, col, start);
mvwaddstr(wd, row, col, start);
return;
error:
sysputstrs(wnd, row, col, width);
sysputstrs(wd, row, col, width);
}
void
sysputwuint64(WINDOW *wd, int row, int col, int width, uint64_t val, int flags)
{
if(val == 0)
sysputspaces(wd, row, col, width);
else
sysputuint64(wd, row, col, width, val, flags);
}
static int
calc_page_shift()
{
u_int page_size;
int shifts;
shifts = 0;
GETSYSCTL("vm.stats.vm.v_page_size", page_size);
for(; page_size > 1; page_size >>= 1)
shifts++;
return shifts;
}
void
sysputpage(WINDOW *wd, int row, int col, int width, uint64_t pages, int flags)
{
static int shifts = 0;
if (shifts == 0)
shifts = calc_page_shift();
pages <<= shifts;
sysputuint64(wd, row, col, width, pages, flags);
}

View File

@ -104,7 +104,6 @@ static struct Info {
/*
* Distribution of page usages.
*/
u_int v_page_size; /* page size in bytes */
u_int v_free_count; /* number of pages free */
u_int v_wire_count; /* number of pages wired down */
u_int v_active_count; /* number of pages active */
@ -173,15 +172,15 @@ closekre(WINDOW *w)
#define STATCOL 0
#define MEMROW 2 /* uses 4 rows and 45 cols */
#define MEMCOL 0
#define PAGEROW 2 /* uses 4 rows and 30 cols */
#define PAGEROW 1 /* uses 4 rows and 30 cols */
#define PAGECOL 47
#define INTSROW 6 /* uses all rows to bottom and 16 cols */
#define INTSROW 5 /* uses all rows to bottom and 16 cols */
#define INTSCOL 64
#define PROCSROW 6 /* uses 3 rows and 19 cols */
#define PROCSCOL 0
#define GENSTATROW 7 /* uses 2 rows and 29 cols */
#define GENSTATCOL 21
#define VMSTATROW 7 /* uses 17 rows and 12-14 cols */
#define VMSTATROW 5 /* uses 17 rows and 12-14 cols */
#define VMSTATCOL 49 /* actually 50-51 for some fields */
#define GRAPHROW 10 /* uses 3 rows and 49-51 cols */
#define GRAPHCOL 0
@ -304,7 +303,7 @@ labelkre(void)
clear();
mvprintw(STATROW, STATCOL + 6, "users Load");
mvprintw(STATROW + 1, STATCOL + 3, "Mem usage: %%Phy %%Kmem");
mvprintw(MEMROW, MEMCOL, "Mem: KB REAL VIRTUAL");
mvprintw(MEMROW, MEMCOL, "Mem: REAL VIRTUAL");
mvprintw(MEMROW + 1, MEMCOL, " Tot Share Tot Share");
mvprintw(MEMROW + 2, MEMCOL, "Act");
mvprintw(MEMROW + 3, MEMCOL, "All");
@ -373,7 +372,7 @@ labelkre(void)
#define PUTRATE(fld, l, c, w) \
do { \
Y(fld); \
putint((int)((float)s.fld/etime + 0.5), l, c, w); \
sysputwuint64(wnd, l, c, w, (s.fld/etime + 0.5), 0); \
} while (0)
#define MAXFAIL 5
@ -454,21 +453,20 @@ showkre(void)
putfloat(avenrun[1], STATROW, STATCOL + 26, 5, 2, 0);
putfloat(avenrun[2], STATROW, STATCOL + 32, 5, 2, 0);
mvaddstr(STATROW, STATCOL + 55, buf);
#define pgtokb(pg) ((pg) * (s.v_page_size / 1024))
putfloat(100.0 * (v_page_count - total.t_free) / v_page_count,
STATROW + 1, STATCOL + 15, 2, 0, 1);
putfloat(100.0 * s.v_kmem_map_size / kmem_size,
STATROW + 1, STATCOL + 22, 2, 0, 1);
putuint64(pgtokb(total.t_arm), MEMROW + 2, MEMCOL + 4, 7);
putuint64(pgtokb(total.t_armshr), MEMROW + 2, MEMCOL + 12, 7);
putuint64(pgtokb(total.t_avm), MEMROW + 2, MEMCOL + 20, 8);
putuint64(pgtokb(total.t_avmshr), MEMROW + 2, MEMCOL + 29, 8);
putuint64(pgtokb(total.t_rm), MEMROW + 3, MEMCOL + 4, 7);
putuint64(pgtokb(total.t_rmshr), MEMROW + 3, MEMCOL + 12, 7);
putuint64(pgtokb(total.t_vm), MEMROW + 3, MEMCOL + 20, 8);
putuint64(pgtokb(total.t_vmshr), MEMROW + 3, MEMCOL + 29, 8);
putuint64(pgtokb(total.t_free), MEMROW + 2, MEMCOL + 38, 7);
sysputpage(wnd, MEMROW + 2, MEMCOL + 4, 7, total.t_arm, 0);
sysputpage(wnd, MEMROW + 2, MEMCOL + 12, 7, total.t_armshr, 0);
sysputpage(wnd, MEMROW + 2, MEMCOL + 20, 8, total.t_avm, 0);
sysputpage(wnd, MEMROW + 2, MEMCOL + 29, 8, total.t_avmshr, 0);
sysputpage(wnd, MEMROW + 3, MEMCOL + 4, 7, total.t_rm, 0);
sysputpage(wnd, MEMROW + 3, MEMCOL + 12, 7, total.t_rmshr, 0);
sysputpage(wnd, MEMROW + 3, MEMCOL + 20, 8, total.t_vm, 0);
sysputpage(wnd, MEMROW + 3, MEMCOL + 29, 8, total.t_vmshr, 0);
sysputpage(wnd, MEMROW + 2, MEMCOL + 38, 7, total.t_free, 0);
putint(total.t_rq - 1, PROCSROW + 2, PROCSCOL, 3);
putint(total.t_pw, PROCSROW + 2, PROCSCOL + 4, 3);
putint(total.t_dw, PROCSROW + 2, PROCSCOL + 8, 3);
@ -487,13 +485,13 @@ showkre(void)
PUTRATE(v_pdwakeups, VMSTATROW + 9, VMSTATCOL, 8);
PUTRATE(v_pdpages, VMSTATROW + 10, VMSTATCOL, 8);
PUTRATE(v_intrans, VMSTATROW + 11, VMSTATCOL, 8);
putuint64(pgtokb(s.v_wire_count), VMSTATROW + 12, VMSTATCOL, 8);
putuint64(pgtokb(s.v_active_count), VMSTATROW + 13, VMSTATCOL, 8);
putuint64(pgtokb(s.v_inactive_count), VMSTATROW + 14, VMSTATCOL, 8);
putuint64(pgtokb(s.v_laundry_count), VMSTATROW + 15, VMSTATCOL, 8);
putuint64(pgtokb(s.v_free_count), VMSTATROW + 16, VMSTATCOL, 8);
sysputpage(wnd, VMSTATROW + 12, VMSTATCOL + 2, 8 - 2, s.v_wire_count, 0);
sysputpage(wnd, VMSTATROW + 13, VMSTATCOL + 2, 8 - 2, s.v_active_count, 0);
sysputpage(wnd, VMSTATROW + 14, VMSTATCOL + 2, 8 - 2, s.v_inactive_count, 0);
sysputpage(wnd, VMSTATROW + 15, VMSTATCOL + 2, 8 - 2, s.v_laundry_count, 0);
sysputpage(wnd, VMSTATROW + 16, VMSTATCOL + 2, 8 - 2, s.v_free_count, 0);
if (LINES - 1 > VMSTATROW + 17)
putuint64(s.bufspace / 1024, VMSTATROW + 17, VMSTATCOL, 8);
sysputuint64(wnd, VMSTATROW + 17, VMSTATCOL + 2, 8 - 2, s.bufspace, 0);
PUTRATE(v_vnodein, PAGEROW + 2, PAGECOL + 6, 5);
PUTRATE(v_vnodeout, PAGEROW + 2, PAGECOL + 12, 5);
PUTRATE(v_swapin, PAGEROW + 2, PAGECOL + 19, 5);
@ -773,7 +771,6 @@ getinfo(struct Info *ls)
GETSYSCTL("vm.stats.vm.v_dfree", ls->v_dfree);
GETSYSCTL("vm.stats.vm.v_pfree", ls->v_pfree);
GETSYSCTL("vm.stats.vm.v_tfree", ls->v_tfree);
GETSYSCTL("vm.stats.vm.v_page_size", ls->v_page_size);
GETSYSCTL("vm.stats.vm.v_free_count", ls->v_free_count);
GETSYSCTL("vm.stats.vm.v_wire_count", ls->v_wire_count);
GETSYSCTL("vm.stats.vm.v_active_count", ls->v_active_count);