[Crash-utility] [PATCH] ps: Introduce -A option

Aaron Tomlin atomlin at redhat.com
Thu Mar 1 11:50:22 UTC 2018


Show only details for the active task on each cpu:

   PID    PPID  CPU       TASK        ST  %MEM     VSZ    RSS  COMM
> 79992      1   3  ffff882456ef6ab0  RU   0.0 42194276  32620  oracle
> 80471      1   0  ffff886b080e0ab0  RU   0.0 42194276  36912  oracle
> 86772  85179   2  ffff8811a8650040  RU   0.0    4072    588  fstab_import
> 88643      1   1  ffff88069366a040  RU   0.0 42231192  55628  oracle

The -A flag is mutually-exclusive in addition to: -a, -t, -c, -p, -g,
-l, -m, -S and -r.

Signed-off-by: Aaron Tomlin <atomlin at redhat.com>
---
 defs.h |  3 ++-
 help.c | 11 ++++++++++-
 task.c | 14 +++++++++++---
 3 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/defs.h b/defs.h
index 4d2fb2f..76827dc 100644
--- a/defs.h
+++ b/defs.h
@@ -4625,8 +4625,9 @@ extern long _ZOMBIE_;
 #define PS_MSECS      (0x20000)
 #define PS_SUMMARY    (0x40000)
 #define PS_POLICY     (0x80000)
+#define PS_ACTIVE    (0x100000)
 
-#define PS_EXCLUSIVE (PS_TGID_LIST|PS_ARGV_ENVP|PS_TIMES|PS_CHILD_LIST|PS_PPID_LIST|PS_LAST_RUN|PS_RLIMIT|PS_MSECS|PS_SUMMARY)
+#define PS_EXCLUSIVE (PS_TGID_LIST|PS_ARGV_ENVP|PS_TIMES|PS_CHILD_LIST|PS_PPID_LIST|PS_LAST_RUN|PS_RLIMIT|PS_MSECS|PS_SUMMARY|PS_ACTIVE)
 
 #define MAX_PS_ARGS    (100)   /* maximum command-line specific requests */
 
diff --git a/help.c b/help.c
index 5b04b09..760fcb0 100644
--- a/help.c
+++ b/help.c
@@ -1251,7 +1251,7 @@ NULL
 char *help_ps[] = {
 "ps",
 "display process status information",
-"[-k|-u|-G|-y policy] [-s] [-p|-c|-t|-[l|m][-C cpu]|-a|-g|-r|-S]\n     [pid | task | command] ...",
+"[-k|-u|-G|-y policy] [-s] [-p|-c|-t|-[l|m][-C cpu]|-a|-g|-r|-S|-A]\n     [pid | task | command] ...",
 "  This command displays process status for selected, or all, processes" ,
 "  in the system.  If no arguments are entered, the process data is",
 "  is displayed for all processes.  Specific processes may be selected",
@@ -1329,6 +1329,7 @@ char *help_ps[] = {
 "       -g  display tasks by thread group, of selected, or all, tasks.",
 "       -r  display resource limits (rlimits) of selected, or all, tasks.",
 "       -S  display a summary consisting of the number of tasks in a task state.",
+"       -A  display only the active task, on each cpu.",
 "\nEXAMPLES",
 "  Show the process status of all current tasks:\n",
 "    %s> ps",
@@ -1483,6 +1484,14 @@ char *help_ps[] = {
 "      UN: 31",
 "      ZO: 1",
 " ",
+"  Display only the active task, on each cpu:\n",
+"    %s> ps -A",
+"        PID    PPID  CPU       TASK        ST  %MEM    VSZ    RSS  COMM",
+"     >    10      2   1  ffff880212969710  IN   0.0      0      0   [migration/1]",
+"     >     0      0   3  ffff884026d43520  RU   0.0      0      0   [swapper]",
+"     >  6582      1   2  ffff880f49c52040  RU   0.0 42202472  33368  oracle",
+"     >  9497      1   0  ffff880549ec2ab0  RU   0.0 42314692 138664  oracle",
+" ",
 "  Show all tasks sorted by their task_struct's last_run, timestamp, or", 
 "  sched_entity last_arrival timestamp value, whichever applies:\n",
 "    %s> ps -l",
diff --git a/task.c b/task.c
index db05ab4..be3b4f0 100644
--- a/task.c
+++ b/task.c
@@ -3240,7 +3240,7 @@ parse_task_thread(int argcnt, char *arglist[], struct task_context *tc) {
 }
 
 static char *ps_exclusive = 
-    "-a, -t, -c, -p, -g, -l, -m, -S and -r flags are all mutually-exclusive\n";
+    "-a, -t, -c, -p, -g, -l, -m, -S, -r and -A flags are all mutually-exclusive\n";
 
 static void
 check_ps_exclusive(ulong flag, ulong thisflag)
@@ -3267,7 +3267,7 @@ cmd_ps(void)
 	cpuspec = NULL;
 	flag = 0;
 
-        while ((c = getopt(argcnt, args, "SgstcpkuGlmarC:y:")) != EOF) {
+        while ((c = getopt(argcnt, args, "ASgstcpkuGlmarC:y:")) != EOF) {
                 switch(c)
 		{
 		case 'k':
@@ -3372,6 +3372,10 @@ cmd_ps(void)
 			flag |= PS_POLICY;
 			psinfo.policy = make_sched_policy(optarg);
 			break;
+		case 'A':
+			check_ps_exclusive(flag, PS_ACTIVE);
+			flag |= PS_ACTIVE;
+			break;
 
 		default:
 			argerrs++;
@@ -3576,6 +3580,10 @@ show_ps_data(ulong flag, struct task_context *tc, struct psinfo *psi)
 
 	task_active = is_task_active(tc->task);
 
+	if ((flag & PS_ACTIVE) && (flag & PS_SHOW_ALL) &&
+			!task_active)
+		return;
+
 	if (task_active) {
 		if (hide_offline_cpu(tc->processor))
 			fprintf(fp, "- ");
@@ -3610,7 +3618,7 @@ show_ps(ulong flag, struct psinfo *psi)
 	int print;
 	char buf[BUFSIZE];
 
-	if (!(flag & (PS_EXCLUSIVE|PS_NO_HEADER))) 
+	if (!(flag & ((PS_EXCLUSIVE & ~PS_ACTIVE)|PS_NO_HEADER))) 
 		fprintf(fp, 
 		    "   PID    PPID  CPU %s  ST  %%MEM     VSZ    RSS  COMM\n",
 			flag & PS_KSTACKP ?
-- 
2.14.3




More information about the Crash-utility mailing list