svn commit: r361084 - head/usr.bin/systat

Michael Reifenberger mr at FreeBSD.org
Fri May 15 17:37:10 UTC 2020


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:   ota at 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);


More information about the svn-src-all mailing list