Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Oct 2016 00:35:40 +0000 (UTC)
From:      =?UTF-8?Q?Dag-Erling_Sm=c3=b8rgrav?= <des@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r307757 - in stable/11: contrib/top usr.bin/top
Message-ID:  <201610220035.u9M0ZeVC050200@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: des
Date: Sat Oct 22 00:35:40 2016
New Revision: 307757
URL: https://svnweb.freebsd.org/changeset/base/307757

Log:
  MFH (r305414): add a toggle to show approximate swap usage.

Modified:
  stable/11/contrib/top/commands.c
  stable/11/contrib/top/machine.h
  stable/11/contrib/top/top.c
  stable/11/contrib/top/top.xs
  stable/11/usr.bin/top/machine.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/contrib/top/commands.c
==============================================================================
--- stable/11/contrib/top/commands.c	Fri Oct 21 23:50:02 2016	(r307756)
+++ stable/11/contrib/top/commands.c	Sat Oct 22 00:35:40 2016	(r307757)
@@ -104,6 +104,7 @@ S       - toggle the displaying of syste
 a       - toggle the displaying of process titles\n\
 t       - toggle the display of this process\n\
 u       - display processes for only one user (+ selects all users)\n\
+w       - toggle the display of swap use for each process\n\
 z       - toggle the displaying of the system idle process\n\
 \n\
 \n", stdout);

Modified: stable/11/contrib/top/machine.h
==============================================================================
--- stable/11/contrib/top/machine.h	Fri Oct 21 23:50:02 2016	(r307756)
+++ stable/11/contrib/top/machine.h	Sat Oct 22 00:35:40 2016	(r307757)
@@ -72,6 +72,7 @@ struct process_select
     int wcpu;		/* show weighted cpu */
     int jid;		/* only this jid (unless jid == -1) */
     int jail;		/* show jail ID */
+    int swap;		/* show swap usage */
     int kidle;		/* show per-CPU idle threads */
     char *command;	/* only this command (unless == NULL) */
 };
@@ -82,8 +83,8 @@ char	*format_header();
 char	*format_next_process();
 void	 toggle_pcpustats(void);
 void	 get_system_info(struct system_info *si);
-int		 machine_init(struct statics *statics, char do_unames);
-int		 proc_owner(int pid);
+int	 machine_init(struct statics *statics, char do_unames);
+int	 proc_owner(int pid);
 
 /* non-int routines typically used by the machine dependent module */
 char	*printable();

Modified: stable/11/contrib/top/top.c
==============================================================================
--- stable/11/contrib/top/top.c	Fri Oct 21 23:50:02 2016	(r307756)
+++ stable/11/contrib/top/top.c	Sat Oct 22 00:35:40 2016	(r307757)
@@ -188,9 +188,9 @@ char *argv[];
     fd_set readfds;
 
 #ifdef ORDER
-    static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPJo";
+    static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPJwo";
 #else
-    static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPJ";
+    static char command_chars[] = "\f qh?en#sdkriIutHmSCajzPJw";
 #endif
 /* these defines enumerate the "strchr"s of the commands in command_chars */
 #define CMD_redraw	0
@@ -219,8 +219,9 @@ char *argv[];
 #define CMD_kidletog	22
 #define CMD_pcputog	23
 #define CMD_jail	24
+#define CMD_swaptog	25
 #ifdef ORDER
-#define CMD_order       25
+#define CMD_order       26
 #endif
 
     /* set the buffer for stdout */
@@ -254,6 +255,7 @@ char *argv[];
     ps.wcpu    = 1;
     ps.jid     = -1;
     ps.jail    = No;
+    ps.swap    = No;
     ps.kidle   = Yes;
     ps.command = NULL;
 
@@ -280,7 +282,7 @@ char *argv[];
 	    optind = 1;
 	}
 
-	while ((i = getopt(ac, av, "CSIHPabijJ:nquvzs:d:U:m:o:t")) != EOF)
+	while ((i = getopt(ac, av, "CSIHPabijJ:nquvzs:d:U:m:o:tw")) != EOF)
 	{
 	    switch(i)
 	    {
@@ -418,6 +420,10 @@ char *argv[];
 		pcpu_stats = !pcpu_stats;
 		break;
 
+	      case 'w':
+		ps.swap = 1;
+		break;
+
 	      case 'z':
 		ps.kidle = !ps.kidle;
 		break;
@@ -1141,6 +1147,15 @@ restart:
 				reset_display();
 				putchar('\r');
 				break;
+			    case CMD_swaptog:
+				ps.swap = !ps.swap;
+				new_message(MT_standout | MT_delayed,
+				    " %sisplaying per-process swap usage.",
+				    ps.swap ? "D" : "Not d");
+				header_text = format_header(uname_field);
+				reset_display();
+				putchar('\r');
+				break;
 			    default:
 				new_message(MT_standout, " BAD CASE IN SWITCH!");
 				putchar('\r');

Modified: stable/11/contrib/top/top.xs
==============================================================================
--- stable/11/contrib/top/top.xs	Fri Oct 21 23:50:02 2016	(r307756)
+++ stable/11/contrib/top/top.xs	Sat Oct 22 00:35:40 2016	(r307757)
@@ -10,7 +10,7 @@ top \- display and update information ab
 .SH SYNOPSIS
 .B top
 [
-.B \-abCHIijnPqStuvz
+.B \-abCHIijnPqStuvwz
 ] [
 .BI \-d count
 ] [
@@ -148,6 +148,9 @@ Write version number information to stde
 No other processing takes place when this option is used.  To see current
 revision information while top is running, use the help command \*(lq?\*(rq.
 .TP
+.B \-w
+Display approximate swap usage for each process.
+.TP
 .B \-z
 Do not display the system idle process.
 .TP
@@ -167,11 +170,12 @@ Set the delay between screen updates to
 seconds.  The default delay between updates is \nD seconds.
 .TP
 .BI \-o field
-Sort the process display area on the specified field.  The field name is
-the name of the column as seen in the output, but in lower case.  Likely
-values are \*(lqcpu\*(rq, \*(lqsize\*(rq, \*(lqres\*(rq, and \*(lqtime\*(rq,
-but may vary on different operating systems.  Note that
-not all operating systems support this option.
+Sort the process display area on the specified field.  The field name
+is the name of the column as seen in the output, but in lower case:
+\*(lqcpu\*(lq, \*(rqsize\*(lq, \*(rqres\*(lq, \*(rqtime\*(lq,
+\*(rqpri\*(lq, \*(rqthreads\*(lq, \*(lqtotal\*(lq, \*(rqread\*(lq,
+\*(rqwrite\*(lq, \*(rqfault\*(lq, \*(rqvcsw\*(lq, \*(rqivcsw\*(lq,
+\*(lqjid\*(lq, \*(rqswap\*(lq or \*(rqpid\*(lq.
 .TP
 .BI \-J jail
 Show only those processes owned by
@@ -226,6 +230,7 @@ The options
 .BR \-S ,
 .BR \-t ,
 .BR \-u ,
+.BR \-w ,
 and
 .B \-z
 are actually toggles.  A second specification of any of these options
@@ -346,6 +351,9 @@ Toggle the display of the
 .I top
 process.
 .TP
+.B w
+Toggle the display of swap usage.
+.TP
 .B z
 Toggle the display of the system idle process.
 .SH "THE DISPLAY"
@@ -379,8 +387,9 @@ is specified, a UID column will be subst
 PRI is the current priority of the process,
 NICE is the nice amount (in the range \-20 to 20),
 SIZE is the total size of the process (text, data, and stack),
-RES is the current amount of resident memory (both SIZE and RES are
-given in kilobytes),
+RES is the current amount of resident memory,
+SWAP is the approximate amount of swap, if enabled
+(SIZE, RES and SWAP are given in kilobytes),
 STATE is the current state (one of \*(lqSTART\*(rq, \*(lqRUN\*(rq
 (shown as \*(lqCPUn\*(rq on SMP systems), \*(lqSLEEP\*(rq, \*(lqSTOP\*(rq,
 \*(lqZOMB\*(rq, \*(lqWAIT\*(rq, \*(lqLOCK\*(rq or the event on which the

Modified: stable/11/usr.bin/top/machine.c
==============================================================================
--- stable/11/usr.bin/top/machine.c	Fri Oct 21 23:50:02 2016	(r307756)
+++ stable/11/usr.bin/top/machine.c	Sat Oct 22 00:35:40 2016	(r307757)
@@ -69,7 +69,9 @@ static int namelength = 8;
 #endif
 /* TOP_JID_LEN based on max of 999999 */
 #define TOP_JID_LEN 7
+#define TOP_SWAP_LEN 6
 static int jidlength;
+static int swaplength;
 static int cmdlengthdelta;
 
 /* Prototypes for top internals */
@@ -111,20 +113,20 @@ static char io_header[] =
     "%5d%*s %-*.*s %6ld %6ld %6ld %6ld %6ld %6ld %6.2f%% %.*s"
 
 static char smp_header_thr[] =
-    "  PID%*s %-*.*s  THR PRI NICE   SIZE    RES STATE   C   TIME %7s COMMAND";
+    "  PID%*s %-*.*s  THR PRI NICE   SIZE    RES%*s STATE   C   TIME %7s COMMAND";
 static char smp_header[] =
-    "  PID%*s %-*.*s "   "PRI NICE   SIZE    RES STATE   C   TIME %7s COMMAND";
+    "  PID%*s %-*.*s "   "PRI NICE   SIZE    RES%*s STATE   C   TIME %7s COMMAND";
 
 #define smp_Proc_format \
-    "%5d%*s %-*.*s %s%3d %4s%7s %6s %-6.6s %2d%7s %6.2f%% %.*s"
+    "%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s %2d%7s %6.2f%% %.*s"
 
 static char up_header_thr[] =
-    "  PID%*s %-*.*s  THR PRI NICE   SIZE    RES STATE    TIME %7s COMMAND";
+    "  PID%*s %-*.*s  THR PRI NICE   SIZE    RES%*s STATE    TIME %7s COMMAND";
 static char up_header[] =
-    "  PID%*s %-*.*s "   "PRI NICE   SIZE    RES STATE    TIME %7s COMMAND";
+    "  PID%*s %-*.*s "   "PRI NICE   SIZE    RES%*s STATE    TIME %7s COMMAND";
 
 #define up_Proc_format \
-    "%5d%*s %-*.*s %s%3d %4s%7s %6s %-6.6s%.0d%7s %6.2f%% %.*s"
+    "%5d%*s %-*.*s %s%3d %4s%7s %6s%*.*s %-6.6s%.0d%7s %6.2f%% %.*s"
 
 
 /* process state names for the "STATE" column of the display */
@@ -227,6 +229,10 @@ static int pageshift;		/* log base 2 of 
 
 #define pagetok(size) ((size) << pageshift)
 
+/* swap usage */
+#define ki_swap(kip) \
+    ((kip)->ki_swrss > (kip)->ki_rssize ? (kip)->ki_swrss - (kip)->ki_rssize : 0)
+
 /* useful externals */
 long percentages();
 
@@ -237,7 +243,7 @@ long percentages();
 char *ordernames[] = {
 	"cpu", "size", "res", "time", "pri", "threads",
 	"total", "read", "write", "fault", "vcsw", "ivcsw",
-	"jid", "pid", NULL
+	"jid", "swap", "pid", NULL
 };
 #endif
 
@@ -252,6 +258,7 @@ static long *pcpu_cp_old;
 static long *pcpu_cp_diff;
 static int *pcpu_cpu_states;
 
+static int compare_swap(const void *a, const void *b);
 static int compare_jid(const void *a, const void *b);
 static int compare_pid(const void *a, const void *b);
 static int compare_tid(const void *a, const void *b);
@@ -412,6 +419,11 @@ format_header(char *uname_field)
 	else
 		jidlength = 0;
 
+	if (ps.swap)
+		swaplength = TOP_SWAP_LEN + 1;  /* +1 for extra left space */
+	else
+		swaplength = 0;
+
 	switch (displaymode) {
 	case DISP_CPU:
 		/*
@@ -426,6 +438,7 @@ format_header(char *uname_field)
 		snprintf(Header, sizeof(Header), prehead,
 		    jidlength, ps.jail ? " JID" : "",
 		    namelength, namelength, uname_field,
+		    swaplength, ps.swap ? " SWAP" : "",
 		    ps.wcpu ? "WCPU" : "CPU");
 		break;
 	case DISP_IO:
@@ -902,7 +915,8 @@ format_next_process(caddr_t handle, char
 	int cpu, state;
 	struct rusage ru, *rup;
 	long p_tot, s_tot;
-	char *proc_fmt, thr_buf[6], jid_buf[TOP_JID_LEN + 1];
+	char *proc_fmt, thr_buf[6];
+	char jid_buf[TOP_JID_LEN + 1], swap_buf[TOP_SWAP_LEN + 1];
 	char *cmdbuf = NULL;
 	char **args;
 	const int cmdlen = 128;
@@ -1061,6 +1075,13 @@ format_next_process(caddr_t handle, char
 		snprintf(jid_buf, sizeof(jid_buf), "%*d",
 		    jidlength - 1, pp->ki_jid);
 
+	if (ps.swap == 0)
+		swap_buf[0] = '\0';
+	else
+		snprintf(swap_buf, sizeof(swap_buf), "%*s",
+		    swaplength - 1,
+		    format_k2(pagetok(ki_swap(pp)))); /* XXX */
+
 	if (displaymode == DISP_IO) {
 		oldp = get_old_proc(pp);
 		if (oldp != NULL) {
@@ -1122,6 +1143,7 @@ format_next_process(caddr_t handle, char
 	    format_nice(pp),
 	    format_k2(PROCSIZE(pp)),
 	    format_k2(pagetok(pp->ki_rssize)),
+	    swaplength, swaplength, swap_buf,
 	    status,
 	    cpu,
 	    format_time(cputime),
@@ -1309,6 +1331,12 @@ static int sorted_state[] = {
 		return (diff > 0 ? 1 : -1); \
 } while (0)
 
+#define ORDERKEY_SWAP(a, b) do { \
+	int diff = (int)ki_swap(b) - (int)ki_swap(a); \
+	if (diff != 0) \
+		return (diff > 0 ? 1 : -1); \
+} while (0)
+
 /* compare_cpu - the comparison function for sorting by cpu percentage */
 
 int
@@ -1357,6 +1385,7 @@ int (*compares[])() = {
 	compare_vcsw,
 	compare_ivcsw,
 	compare_jid,
+	compare_swap,
 	NULL
 };
 
@@ -1467,6 +1496,24 @@ compare_jid(const void *arg1, const void
 
 	return (0);
 }
+
+/* compare_swap - the comparison function for sorting by swap */
+static int
+compare_swap(const void *arg1, const void *arg2)
+{
+	struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
+	struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
+
+	ORDERKEY_SWAP(p1, p2);
+	ORDERKEY_PCTCPU(p1, p2);
+	ORDERKEY_CPTICKS(p1, p2);
+	ORDERKEY_STATE(p1, p2);
+	ORDERKEY_PRIO(p1, p2);
+	ORDERKEY_RSSIZE(p1, p2);
+	ORDERKEY_MEM(p1, p2);
+
+	return (0);
+}
 #endif /* ORDER */
 
 /* assorted comparison functions for sorting by i/o */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201610220035.u9M0ZeVC050200>