[PATCH] Toggle display of the kernel idle process (per-CPU idle threads) in top

From: John Baldwin <jhb_at_freebsd.org>
Date: Fri, 27 May 2011 10:46:30 -0400
Some times in top, I don't want to see all the per-CPU idle threads but 
instead focus on the non-idle threads that are running.  Especially on a 
system with a lot of CPUs, the idle threads can push all the interesting 
threads off of the list.  This patch adds a new 'z' flag (gratuitously chosen 
letter) and interactive command to toggle the display of the system idle 
process.  Patch is tested against 8, but should work fine on HEAD too:

Index: contrib/top/commands.c
===================================================================
--- contrib/top/commands.c	(revision 221924)
+++ contrib/top/commands.c	(working copy)
_at__at_ -94,6 +94,7 _at__at_
 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\
+z       - toggle the displaying of system idle process\n\
 \n\
 \n", stdout);
     }
Index: contrib/top/top.c
===================================================================
--- contrib/top/top.c	(revision 221924)
+++ contrib/top/top.c	(working copy)
_at__at_ -196,9 +196,9 _at__at_
     fd_set readfds;
 
 #ifdef ORDER
-    static char command_chars[] = "\f qh?en#sdkriIutHmSCajo";
+    static char command_chars[] = "\f qh?en#sdkriIutHmSCajzo";
 #else
-    static char command_chars[] = "\f qh?en#sdkriIutHmSCaj";
+    static char command_chars[] = "\f qh?en#sdkriIutHmSCajz";
 #endif
 /* these defines enumerate the "strchr"s of the commands in command_chars */
 #define CMD_redraw	0
_at__at_ -224,8 +224,9 _at__at_
 #define	CMD_wcputog	19
 #define	CMD_showargs	20
 #define	CMD_jidtog	21
+#define CMD_kidletog	22
 #ifdef ORDER
-#define CMD_order       22
+#define CMD_order       23
 #endif
 
     /* set the buffer for stdout */
_at__at_ -258,6 +259,7 _at__at_
     ps.thread  = No;
     ps.wcpu    = 1;
     ps.jail    = No;
+    ps.kidle   = Yes;
     ps.command = NULL;
 
     /* get preset options from the environment */
_at__at_ -283,7 +285,7 _at__at_
 	    optind = 1;
 	}
 
-	while ((i = getopt(ac, av, "CSIHPabijnquvs:d:U:m:o:t")) != EOF)
+	while ((i = getopt(ac, av, "CSIHPabijnquvzs:d:U:m:o:t")) != EOF)
 	{
 	    switch(i)
 	    {
_at__at_ -412,10 +414,14 _at__at_
 		pcpu_stats = Yes;
 		break;
 
+	      case 'z':
+		ps.kidle = !ps.kidle;
+		break;
+
 	      default:
 		fprintf(stderr,
 "Top version %s\n"
-"Usage: %s [-abCHIijnPqStuv] [-d count] [-m io | cpu] [-o field] [-s time]\n"
+"Usage: %s [-abCHIijnPqStuvz] [-d count] [-m io | cpu] [-o field] [-s 
time]\n"
 "       [-U username] [number]\n",
 			version_string(), myname);
 		exit(1);
_at__at_ -1075,7 +1081,13 _at__at_
 				reset_display();
 				putchar('\r');
 				break;
-	    
+			    case CMD_kidletog:
+				ps.kidle = !ps.kidle;
+				new_message(MT_standout | MT_delayed,
+				    " %sisplaying kernel idle process.",
+				    ps.idle ? "D" : "Not d");
+				putchar('\r');
+				break;
 			    default:
 				new_message(MT_standout, " BAD CASE IN SWITCH!");
 				putchar('\r');
Index: contrib/top/machine.h
===================================================================
--- contrib/top/machine.h	(revision 221924)
+++ contrib/top/machine.h	(working copy)
_at__at_ -65,6 +65,7 _at__at_
     int uid;		/* only this uid (unless uid == -1) */
     int wcpu;		/* show weighted cpu */
     int jail;		/* show jail ID */
+    int kidle;		/* show per-CPU idle threads */
     char *command;	/* only this command (unless == NULL) */
 };
 
Index: contrib/top/top.X
===================================================================
--- contrib/top/top.X	(revision 221924)
+++ contrib/top/top.X	(working copy)
_at__at_ -10,7 +10,7 _at__at_
 .SH SYNOPSIS
 .B top
 [
-.B \-abCHIijnPqStuv
+.B \-abCHIijnPqStuvz
 ] [
 .BI \-d count
 ] [
_at__at_ -142,6 +142,9 _at__at_
 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 \-z
+Do not display the system idle process.
+.TP
 .BI \-d count
 Show only
 .I count
_at__at_ -303,6 +306,9 _at__at_
 Toggle the display of the
 .I top
 process.
+.TP
+.B z
+Toggle the display of the system idle process.
 .SH "THE DISPLAY"
 The actual display varies depending on the specific variant of Unix
 that the machine is running.  This description may not exactly match
Index: usr.bin/top/machine.c
===================================================================
--- usr.bin/top/machine.c	(revision 221924)
+++ usr.bin/top/machine.c	(working copy)
_at__at_ -623,6 +623,7 _at__at_
 	int show_system;
 	int show_uid;
 	int show_command;
+	int show_kidle;
 
 	/*
 	 * Save the previous process info.
_at__at_ -663,6 +664,7 _at__at_
 	show_system = sel->system;
 	show_uid = sel->uid != -1;
 	show_command = sel->command != NULL;
+	show_kidle = sel->kidle;
 
 	/* count up process states and get pointers to interesting procs */
 	total_procs = 0;
_at__at_ -704,6 +706,11 _at__at_
 			/* skip idle or non-running processes */
 			continue;
 
+		if (displaymode == DISP_CPU && !show_kidle &&
+		    pp->ki_tdflags & TDF_IDLETD)
+			/* skip kernel idle process */
+			continue;
+		    
 		if (displaymode == DISP_IO && !show_idle && p_io == 0)
 			/* skip processes that aren't doing I/O */
 			continue;

-- 
John Baldwin
Received on Fri May 27 2011 - 12:46:31 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:14 UTC