Author: mr
Date: Fri May 15 17:37:08 2020
New Revision: 361084
URL: https://svnweb.freebsd.org/changeset/base/361084

Log:
  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:   o...@j.email.ne.jp
  MFC after: 2 weeks
  Differential Revision:  D24834

Modified:
  head/usr.bin/systat/extern.h
  head/usr.bin/systat/fetch.c
  head/usr.bin/systat/sysput.c
  head/usr.bin/systat/vmstat.c

Modified: head/usr.bin/systat/extern.h
==============================================================================
--- head/usr.bin/systat/extern.h        Fri May 15 16:14:50 2020        
(r361083)
+++ head/usr.bin/systat/extern.h        Fri May 15 17:37:08 2020        
(r361084)
@@ -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 *); \

Modified: head/usr.bin/systat/fetch.c
==============================================================================
--- head/usr.bin/systat/fetch.c Fri May 15 16:14:50 2020        (r361083)
+++ head/usr.bin/systat/fetch.c Fri May 15 17:37:08 2020        (r361084)
@@ -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));

Modified: head/usr.bin/systat/sysput.c
==============================================================================
--- head/usr.bin/systat/sysput.c        Fri May 15 16:14:50 2020        
(r361083)
+++ head/usr.bin/systat/sysput.c        Fri May 15 17:37:08 2020        
(r361084)
@@ -41,15 +41,23 @@ __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[] = "****************************************";
 
        mvwaddstr(wnd, row, col, str40 + sizeof(str40) - width - 1);
 }
 
 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,
                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);
 }

Modified: head/usr.bin/systat/vmstat.c
==============================================================================
--- head/usr.bin/systat/vmstat.c        Fri May 15 16:14:50 2020        
(r361083)
+++ head/usr.bin/systat/vmstat.c        Fri May 15 17:37:08 2020        
(r361084)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to