Commit 5bdee4f0 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf daemon: Add up time for daemon/session list



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: default avatarJiri 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 6d6162d5
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@
#include <sys/wait.h>
#include <sys/wait.h>
#include <poll.h>
#include <poll.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <time.h>
#include "builtin.h"
#include "builtin.h"
#include "perf.h"
#include "perf.h"
#include "debug.h"
#include "debug.h"
@@ -80,6 +81,7 @@ struct daemon_session {
	int				 pid;
	int				 pid;
	struct list_head		 list;
	struct list_head		 list;
	enum daemon_session_state	 state;
	enum daemon_session_state	 state;
	time_t				 start;
};
};


struct daemon {
struct daemon {
@@ -93,6 +95,7 @@ struct daemon {
	FILE			*out;
	FILE			*out;
	char			 perf[PATH_MAX];
	char			 perf[PATH_MAX];
	int			 signal_fd;
	int			 signal_fd;
	time_t			 start;
};
};


static struct daemon __daemon = {
static struct daemon __daemon = {
@@ -335,6 +338,8 @@ static int daemon_session__run(struct daemon_session *session,
		return -1;
		return -1;
	}
	}


	session->start = time(NULL);

	session->pid = fork();
	session->pid = fork();
	if (session->pid < 0)
	if (session->pid < 0)
		return -1;
		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;
	char csv_sep = cmd->list.csv_sep;
	struct daemon_session *session;
	struct daemon_session *session;
	time_t curr = time(NULL);


	if (csv_sep) {
	if (csv_sep) {
		fprintf(out, "%d%c%s%c%s%c%s/%s",
		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 */
			/* lock */
			csv_sep, daemon->base, "lock");
			csv_sep, daemon->base, "lock");


		fprintf(out, "%c%lu",
			/* session up time */
			csv_sep, (curr - daemon->start) / 60);

		fprintf(out, "\n");
		fprintf(out, "\n");
	} else {
	} else {
		fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base);
		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);
				daemon->base, SESSION_OUTPUT);
			fprintf(out, "  lock:    %s/lock\n",
			fprintf(out, "  lock:    %s/lock\n",
				daemon->base);
				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 */
				/* session ack */
				csv_sep, session->base, SESSION_ACK);
				csv_sep, session->base, SESSION_ACK);


			fprintf(out, "%c%lu",
				/* session up time */
				csv_sep, (curr - session->start) / 60);

			fprintf(out, "\n");
			fprintf(out, "\n");
		} else {
		} else {
			fprintf(out, "[%d:%s] perf record %s\n",
			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);
				session->base, SESSION_CONTROL);
			fprintf(out, "  ack:     %s/%s\n",
			fprintf(out, "  ack:     %s/%s\n",
				session->base, SESSION_ACK);
				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)
	if (argc)
		usage_with_options(daemon_usage, start_options);
		usage_with_options(daemon_usage, start_options);


	daemon->start = time(NULL);

	if (setup_config(daemon)) {
	if (setup_config(daemon)) {
		pr_err("failed: config not found\n");
		pr_err("failed: config not found\n");
		return -1;
		return -1;