From: Jiri Olsa Date: Mon, 8 Feb 2021 20:08:45 +0000 (+0100) Subject: perf daemon: Add daemon command X-Git-Tag: accepted/tizen/unified/20230118.172025~7783^2~72 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d450bc501fbdceb9d71663ba8192b72f01001bf1;p=platform%2Fkernel%2Flinux-rpi.git perf daemon: Add daemon command 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 Cc: Alexander Shishkin Cc: Alexei Budankov Cc: Arnaldo Carvalho de Melo Cc: Ian Rogers Cc: Ingo Molnar Cc: Mark Rutland Cc: Michael Petlan Cc: Namhyung Kim Cc: Peter Zijlstra Link: https://lore.kernel.org/r/20210208200908.1019149-2-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- diff --git a/tools/perf/Build b/tools/perf/Build index 5f392db..db61dbe 100644 --- a/tools/perf/Build +++ b/tools/perf/Build @@ -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 index 0000000..d05b8da --- /dev/null +++ b/tools/perf/Documentation/perf-daemon.txt @@ -0,0 +1,40 @@ +perf-daemon(1) +============== + + +NAME +---- +perf-daemon - Run record sessions on background + + +SYNOPSIS +-------- +[verse] +'perf daemon' +'perf daemon' [] +'perf daemon start' [] + + +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 index 0000000..8b13e45 --- /dev/null +++ b/tools/perf/builtin-daemon.c @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include +#include +#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 []", + "perf daemon []", + 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; +} diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h index 14a2db6..7303e80 100644 --- a/tools/perf/builtin.h +++ b/tools/perf/builtin.h @@ -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); diff --git a/tools/perf/command-list.txt b/tools/perf/command-list.txt index bc6c585..825a12e 100644 --- a/tools/perf/command-list.txt +++ b/tools/perf/command-list.txt @@ -31,3 +31,4 @@ perf-timechart mainporcelain common perf-top mainporcelain common perf-trace mainporcelain audit perf-version mainporcelain common +perf-daemon mainporcelain common diff --git a/tools/perf/perf.c b/tools/perf/perf.c index 27f94b0..20cb91e 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c @@ -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 {