Display up time for both daemon and sessions.

Example:

  # cat ~/.perfconfig
  [daemon]
  base=/opt/perfdata

  [session-cycles]
  run = -m 10M -e cycles --overwrite --switch-output -a

  [session-sched]
  run = -m 20M -e sched:* --overwrite --switch-output -a

Starting the daemon:

  # perf daemon start

Get the details with up time:

  # perf daemon -v
  [778315:daemon] base: /opt/perfdata
    output:  /opt/perfdata/output
    lock:    /opt/perfdata/lock
    up:      15 minutes
  [778316:cycles] perf record -m 20M -e cycles --overwrite --switch-output -a
    base:    /opt/perfdata/session-cycles
    output:  /opt/perfdata/session-cycles/output
    control: /opt/perfdata/session-cycles/control
    ack:     /opt/perfdata/session-cycles/ack
    up:      10 minutes
  [778317:sched] perf record -m 20M -e sched:* --overwrite --switch-output -a
    base:    /opt/perfdata/session-sched
    output:  /opt/perfdata/session-sched/output
    control: /opt/perfdata/session-sched/control
    ack:     /opt/perfdata/session-sched/ack
    up:      2 minutes

Signed-off-by: Jiri Olsa <[email protected]>
---
 tools/perf/builtin-daemon.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c
index 11f9fac4cf12..90ef14353804 100644
--- a/tools/perf/builtin-daemon.c
+++ b/tools/perf/builtin-daemon.c
@@ -25,6 +25,7 @@
 #include <sys/wait.h>
 #include <poll.h>
 #include <sys/stat.h>
+#include <time.h>
 #include "builtin.h"
 #include "perf.h"
 #include "debug.h"
@@ -80,6 +81,7 @@ struct daemon_session {
        int                              pid;
        struct list_head                 list;
        enum daemon_session_state        state;
+       time_t                           start;
 };
 
 struct daemon {
@@ -93,6 +95,7 @@ struct daemon {
        FILE                    *out;
        char                     perf[PATH_MAX];
        int                      signal_fd;
+       time_t                   start;
 };
 
 static struct daemon __daemon = {
@@ -335,6 +338,8 @@ static int daemon_session__run(struct daemon_session 
*session,
                return -1;
        }
 
+       session->start = time(NULL);
+
        session->pid = fork();
        if (session->pid < 0)
                return -1;
@@ -666,6 +671,7 @@ static int cmd_session_list(struct daemon *daemon, union 
cmd *cmd, FILE *out)
 {
        char csv_sep = cmd->list.csv_sep;
        struct daemon_session *session;
+       time_t curr = time(NULL);
 
        if (csv_sep) {
                fprintf(out, "%d%c%s%c%s%c%s/%s",
@@ -680,6 +686,10 @@ static int cmd_session_list(struct daemon *daemon, union 
cmd *cmd, FILE *out)
                        /* lock */
                        csv_sep, daemon->base, "lock");
 
+               fprintf(out, "%c%lu",
+                       /* session up time */
+                       csv_sep, (curr - daemon->start) / 60);
+
                fprintf(out, "\n");
        } else {
                fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base);
@@ -688,6 +698,8 @@ static int cmd_session_list(struct daemon *daemon, union 
cmd *cmd, FILE *out)
                                daemon->base, SESSION_OUTPUT);
                        fprintf(out, "  lock:    %s/lock\n",
                                daemon->base);
+                       fprintf(out, "  up:      %lu minutes\n",
+                               (curr - daemon->start) / 60);
                }
        }
 
@@ -713,6 +725,10 @@ static int cmd_session_list(struct daemon *daemon, union 
cmd *cmd, FILE *out)
                                /* session ack */
                                csv_sep, session->base, SESSION_ACK);
 
+                       fprintf(out, "%c%lu",
+                               /* session up time */
+                               csv_sep, (curr - session->start) / 60);
+
                        fprintf(out, "\n");
                } else {
                        fprintf(out, "[%d:%s] perf record %s\n",
@@ -727,6 +743,8 @@ static int cmd_session_list(struct daemon *daemon, union 
cmd *cmd, FILE *out)
                                session->base, SESSION_CONTROL);
                        fprintf(out, "  ack:     %s/%s\n",
                                session->base, SESSION_ACK);
+                       fprintf(out, "  up:      %lu minutes\n",
+                               (curr - session->start) / 60);
                }
        }
 
@@ -1226,6 +1244,8 @@ static int __cmd_start(struct daemon *daemon, struct 
option parent_options[],
        if (argc)
                usage_with_options(daemon_usage, start_options);
 
+       daemon->start = time(NULL);
+
        if (setup_config(daemon)) {
                pr_err("failed: config not found\n");
                return -1;
-- 
2.29.2

Reply via email to