]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf daemon: Add daemon command
authorJiri Olsa <jolsa@kernel.org>
Mon, 8 Feb 2021 20:08:45 +0000 (21:08 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 9 Feb 2021 18:42:57 +0000 (15:42 -0300)
Add a daemon skeleton with a minimal base (non) functionality, covering
various setup in start command.

Add an initial perf-daemon.txt with basic info.

This is in response to pople asking for the possibility to be able run
record long running sessions on the background.

The patchset that starts with this adds support to configure and run
record sessions on background via new 'perf daemon' command.

This is useful for being able to use perf as a flight recorder that one
can interact with asking for events to be enabled or disabled, added or
removed, etc.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
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-2-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Build
tools/perf/Documentation/perf-daemon.txt [new file with mode: 0644]
tools/perf/builtin-daemon.c [new file with mode: 0644]
tools/perf/builtin.h
tools/perf/command-list.txt
tools/perf/perf.c

index 5f392dbb88fc6923266a0b274a1dc64861ec6cf8..db61dbe2b5439a270799962c13cb46273657ce4a 100644 (file)
@@ -24,6 +24,7 @@ perf-y += builtin-mem.o
 perf-y += builtin-data.o
 perf-y += builtin-version.o
 perf-y += builtin-c2c.o
+perf-y += builtin-daemon.o
 
 perf-$(CONFIG_TRACE) += builtin-trace.o
 perf-$(CONFIG_LIBELF) += builtin-probe.o
diff --git a/tools/perf/Documentation/perf-daemon.txt b/tools/perf/Documentation/perf-daemon.txt
new file mode 100644 (file)
index 0000000..d05b8da
--- /dev/null
@@ -0,0 +1,40 @@
+perf-daemon(1)
+==============
+
+
+NAME
+----
+perf-daemon - Run record sessions on background
+
+
+SYNOPSIS
+--------
+[verse]
+'perf daemon'
+'perf daemon' [<options>]
+'perf daemon start'  [<options>]
+
+
+DESCRIPTION
+-----------
+This command allows to run simple daemon process that starts and
+monitors configured record sessions.
+
+
+OPTIONS
+-------
+-v::
+--verbose::
+       Be more verbose.
+
+All generic options are available also under commands.
+
+
+START COMMAND
+-------------
+The start command creates the daemon process.
+
+
+SEE ALSO
+--------
+linkperf:perf-record[1], linkperf:perf-config[1]
diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c
new file mode 100644 (file)
index 0000000..8b13e45
--- /dev/null
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <subcmd/parse-options.h>
+#include <linux/limits.h>
+#include <string.h>
+#include <signal.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "builtin.h"
+#include "perf.h"
+#include "debug.h"
+#include "util.h"
+
+struct daemon {
+       char                    *base;
+       FILE                    *out;
+       char                     perf[PATH_MAX];
+};
+
+static struct daemon __daemon = { };
+
+static const char * const daemon_usage[] = {
+       "perf daemon start [<options>]",
+       "perf daemon [<options>]",
+       NULL
+};
+
+static bool done;
+
+static void sig_handler(int sig __maybe_unused)
+{
+       done = true;
+}
+
+static int __cmd_start(struct daemon *daemon, struct option parent_options[],
+                      int argc, const char **argv)
+{
+       struct option start_options[] = {
+               OPT_PARENT(parent_options),
+               OPT_END()
+       };
+       int err = 0;
+
+       argc = parse_options(argc, argv, start_options, daemon_usage, 0);
+       if (argc)
+               usage_with_options(daemon_usage, start_options);
+
+       debug_set_file(daemon->out);
+       debug_set_display_time(true);
+
+       pr_info("daemon started (pid %d)\n", getpid());
+
+       signal(SIGINT, sig_handler);
+       signal(SIGTERM, sig_handler);
+
+       while (!done && !err) {
+               sleep(1);
+       }
+
+       pr_info("daemon exited\n");
+       fclose(daemon->out);
+       return err;
+}
+
+int cmd_daemon(int argc, const char **argv)
+{
+       struct option daemon_options[] = {
+               OPT_INCR('v', "verbose", &verbose, "be more verbose"),
+               OPT_END()
+       };
+
+       perf_exe(__daemon.perf, sizeof(__daemon.perf));
+       __daemon.out = stdout;
+
+       argc = parse_options(argc, argv, daemon_options, daemon_usage,
+                            PARSE_OPT_STOP_AT_NON_OPTION);
+
+       if (argc) {
+               if (!strcmp(argv[0], "start"))
+                       return __cmd_start(&__daemon, daemon_options, argc, argv);
+
+               pr_err("failed: unknown command '%s'\n", argv[0]);
+               return -1;
+       }
+
+       return -1;
+}
index 14a2db622a7b91eb17067013685ffd6499ee6462..7303e80a639c67abcc54138e0949ed0e2c3f55ef 100644 (file)
@@ -37,6 +37,7 @@ int cmd_inject(int argc, const char **argv);
 int cmd_mem(int argc, const char **argv);
 int cmd_data(int argc, const char **argv);
 int cmd_ftrace(int argc, const char **argv);
+int cmd_daemon(int argc, const char **argv);
 
 int find_scripts(char **scripts_array, char **scripts_path_array, int num,
                 int pathlen);
index bc6c585f74fc2be63a69f2a55825139fbf97a1c6..825a12e8d69495368f7d0d71de580193e1bdafd4 100644 (file)
@@ -31,3 +31,4 @@ perf-timechart                        mainporcelain common
 perf-top                       mainporcelain common
 perf-trace                     mainporcelain audit
 perf-version                   mainporcelain common
+perf-daemon                    mainporcelain common
index 27f94b0bb8747c3c3b72609fe9d875785cd69dc7..20cb91ef06ffc9ef97c3aff3b191098ea08bb83d 100644 (file)
@@ -88,6 +88,7 @@ static struct cmd_struct commands[] = {
        { "mem",        cmd_mem,        0 },
        { "data",       cmd_data,       0 },
        { "ftrace",     cmd_ftrace,     0 },
+       { "daemon",     cmd_daemon,     0 },
 };
 
 struct pager_config {