perf daemon: Add up time for daemon/session list
authorJiri Olsa <jolsa@kernel.org>
Mon, 8 Feb 2021 20:09:01 +0000 (21:09 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 11 Feb 2021 13:19:52 +0000 (10:19 -0300)
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 <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: https://lore.kernel.org/r/20210208200908.1019149-18-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-daemon.c

index c36f521..617feaf 100644 (file)
@@ -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;
@@ -665,6 +670,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",
@@ -679,6 +685,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);
@@ -687,6 +697,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);
                }
        }
 
@@ -712,6 +724,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",
@@ -726,6 +742,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);
                }
        }
 
@@ -1239,6 +1257,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;