[PATCH] ps: Introduce -A option
by Aaron Tomlin
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(a)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
6 years, 10 months