Index: engine.c =================================================================== RCS file: /cvs/src/usr.bin/systat/engine.c,v diff -u -p -r1.30 engine.c --- engine.c 10 Oct 2023 09:30:06 -0000 1.30 +++ engine.c 9 Jul 2025 02:38:58 -0000 @@ -718,11 +718,40 @@ ok: print_fld_tb(fld); } +int +fmt_sdiv(char *dst, size_t len, uint64_t size, int d) +{ + static const char *mult = "\0KMGTPEZY"; + char suffix[2] = "B"; + int i = 0; + int rv; + + if (len < 2) + return (-1); + + while (size >= 10000 && i < sizeof(mult)) { + i++; + size /= d; + } + + suffix[0] = mult[i]; /* help *printf count the length */ + rv = snprintf(dst, len, "%llu%s", size, suffix); + if (rv == -1) + return (-1); + if (rv >= len) { + dst[0] = '*'; + dst[1] = '\0'; + rv = 1; + } + + return (rv); +} + void print_fld_sdiv(field_def *fld, u_int64_t size, int d) { int len; - char *mult = "KMGTPE"; + static const char *mult = "KMGTPEZY"; int i = -1; if (fld == NULL) Index: engine.h =================================================================== RCS file: /cvs/src/usr.bin/systat/engine.h,v diff -u -p -r1.14 engine.h --- engine.h 2 Jul 2021 15:34:16 -0000 1.14 +++ engine.h 9 Jul 2025 02:38:58 -0000 @@ -102,6 +102,8 @@ enum message_mode { MESSAGE_ORDER }; +int fmt_sdiv(char *, size_t, uint64_t, int); + void tb_start(void); void tb_end(void); Index: vmstat.c =================================================================== RCS file: /cvs/src/usr.bin/systat/vmstat.c,v diff -u -p -r1.97 vmstat.c --- vmstat.c 25 Feb 2025 11:29:17 -0000 1.97 +++ vmstat.c 9 Jul 2025 02:38:58 -0000 @@ -90,6 +90,8 @@ void putint(int, int, int, int); void putintmk(int, int, int, int); void putuint64(u_int64_t, int, int, int); void putfloat(double, int, int, int, int, int); +void putiec(uint64_t, int, int, int); +void putsi(uint64_t, int, int, int); int ucount(void); void print_vm(void); @@ -233,7 +235,7 @@ labelkre(void) int i, j, l; mvprintw(MEMROW, MEMCOL, " memory totals (in KB)"); - mvprintw(MEMROW + 1, MEMCOL, " real virtual free"); + mvprintw(MEMROW + 1, MEMCOL, "Memory real virtual free"); mvprintw(MEMROW + 2, MEMCOL, "Active"); mvprintw(MEMROW + 3, MEMCOL, "All"); @@ -321,6 +323,11 @@ labelkre(void) Y(fld); \ putint((int)((float)s.fld/etime + 0.5), l, c, w); \ } while (0) +#define PUTSIRATE(fld, l, c, w) \ + do { \ + Y(fld); \ + putsi((double)s.fld/etime + 0.5, l, c, w); \ + } while (0) static char cpuchar[] = { '|', '@', '=', '>', ' ' }; static char cpuorder[] = { CP_INTR, CP_SPIN, CP_SYS, CP_USER, CP_IDLE }; @@ -336,6 +343,7 @@ showkre(void) int i, l, c; static int first_run = 0; double etime; + char membuf[8]; clock_gettime(CLOCK_UPTIME, &now); timespecsub(&now, &prev, &elapsed); @@ -386,16 +394,19 @@ showkre(void) addch(cpuchar[c]); } -#define pgtokb(pg) ((pg) * (s.uvmexp.pagesize / 1024)) +#define pgtob(pg) ((unsigned long)(pg) * (s.uvmexp.pagesize)) - putint(pgtokb(s.uvmexp.active), MEMROW + 2, MEMCOL + 7, 8); - putint(pgtokb(s.uvmexp.active + s.uvmexp.swpginuse), /* XXX */ + putiec(pgtob(s.uvmexp.active), + MEMROW + 2, MEMCOL + 7, 8); + putiec(pgtob(s.uvmexp.active + s.uvmexp.swpginuse), /* XXX */ MEMROW + 2, MEMCOL + 17, 8); - putint(pgtokb(s.uvmexp.npages - s.uvmexp.free), MEMROW + 3, MEMCOL + 7, 8); - putint(pgtokb(s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse), + putiec(pgtob(s.uvmexp.npages - s.uvmexp.free), + MEMROW + 3, MEMCOL + 7, 8); + putiec(pgtob(s.uvmexp.npages - s.uvmexp.free + s.uvmexp.swpginuse), MEMROW + 3, MEMCOL + 17, 8); - putint(pgtokb(s.uvmexp.free), MEMROW + 2, MEMCOL + 26, 8); - putint(pgtokb(s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse), + putiec(pgtob(s.uvmexp.free), + MEMROW + 2, MEMCOL + 26, 8); + putiec(pgtob(s.uvmexp.free + s.uvmexp.swpages - s.uvmexp.swpginuse), MEMROW + 3, MEMCOL + 26, 8); putint(total.t_rq - 1, PROCSROW + 1, PROCSCOL + 3, 3); @@ -430,12 +441,12 @@ showkre(void) PUTRATE(uvmexp.pgswapin, PAGEROW + 3, PAGECOL + 5, 5); PUTRATE(uvmexp.pgswapout, PAGEROW + 3, PAGECOL + 10, 5); - PUTRATE(uvmexp.swtch, GENSTATROW + 1, GENSTATCOL, 6); - PUTRATE(uvmexp.traps, GENSTATROW + 1, GENSTATCOL + 6, 6); - PUTRATE(uvmexp.syscalls, GENSTATROW + 1, GENSTATCOL + 12, 6); - PUTRATE(uvmexp.intrs, GENSTATROW + 1, GENSTATCOL + 18, 6); - PUTRATE(uvmexp.softs, GENSTATROW + 1, GENSTATCOL + 24, 6); - PUTRATE(uvmexp.faults, GENSTATROW + 1, GENSTATCOL + 30, 5); + PUTSIRATE(uvmexp.swtch, GENSTATROW + 1, GENSTATCOL, 6); + PUTSIRATE(uvmexp.traps, GENSTATROW + 1, GENSTATCOL + 6, 6); + PUTSIRATE(uvmexp.syscalls, GENSTATROW + 1, GENSTATCOL + 12, 6); + PUTSIRATE(uvmexp.intrs, GENSTATROW + 1, GENSTATCOL + 18, 6); + PUTSIRATE(uvmexp.softs, GENSTATROW + 1, GENSTATCOL + 24, 6); + PUTSIRATE(uvmexp.faults, GENSTATROW + 1, GENSTATCOL + 30, 5); mvprintw(DISKROW, DISKCOL + 5, " "); for (i = 0, c = 0; i < cur.dk_ndrive && c < DRIVESPACE; i++) if (cur.dk_select[i] && (c + strlen(dr_name[i])) < DRIVESPACE) { @@ -505,6 +516,43 @@ cputime(int indx) } void +putscaled(uint64_t v, int l, int c, int w, int div) +{ + char b[128]; + int rv; + + move(l, c); + if (v == 0) + goto pad; + + rv = fmt_sdiv(b, sizeof(b), v, div); + if (rv == -1) + goto pad; + w -= rv; + while (w-- > 0) + addch(' '); + + addstr(b); + return; + +pad: + while (w-- > 0) + addch(' '); +} + +void +putiec(uint64_t bytes, int l, int c, int w) +{ + putscaled(bytes, l, c, w, 1024); +} + +void +putsi(uint64_t bytes, int l, int c, int w) +{ + putscaled(bytes, l, c, w, 1000); +} + +void putint(int n, int l, int c, int w) { char b[128]; @@ -668,7 +716,8 @@ copyinfo(struct Info *from, struct Info static void dinfo(int dn, int c, double etime) { - double words, atime; + double atime; + uint64_t bytes; c += DISKCOL; @@ -677,12 +726,12 @@ dinfo(int dn, int c, double etime) ((double)cur.dk_time[dn].tv_usec / (double)1000000); /* # of K transferred */ - words = (cur.dk_rbytes[dn] + cur.dk_wbytes[dn]) / 1024.0; + bytes = cur.dk_rbytes[dn] + cur.dk_wbytes[dn]; putint((int)((float)cur.dk_seek[dn]/etime+0.5), DISKROW + 1, c, 5); putint((int)((float)(cur.dk_rxfer[dn] + cur.dk_wxfer[dn])/etime+0.5), DISKROW + 2, c, 5); - putintmk((int)(words/etime + 0.5), DISKROW + 3, c, 5); + putiec(bytes, DISKROW + 3, c, 5); putfloat(atime/etime, DISKROW + 4, c, 5, 1, 1); }