diff options
author | Jiri Olsa <jolsa@kernel.org> | 2021-02-08 21:08:56 +0100 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2021-02-11 10:02:54 -0300 |
commit | 23c5831e2e040f7a044743a2e6e060426d579d7f (patch) | |
tree | 298d9276c38ecb843af8b1c71866c938b1e24c0a /tools/perf/builtin-daemon.c | |
parent | 2d6914cd59ffb6716154f81f1c23145747887514 (diff) |
perf daemon: Add 'stop' command
Add 'perf daemon stop' command to stop daemon process and all running
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
Start the daemon:
# perf daemon start
Stop the daemon
# perf daemon stop
Daemon is not running, nothing to connect to:
# perf daemon
connect error: Connection refused
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-13-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-daemon.c')
-rw-r--r-- | tools/perf/builtin-daemon.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c index a2c53d35ec69..324ce43e8ab1 100644 --- a/tools/perf/builtin-daemon.c +++ b/tools/perf/builtin-daemon.c @@ -532,6 +532,7 @@ static int setup_server_socket(struct daemon *daemon) enum { CMD_LIST = 0, CMD_SIGNAL = 1, + CMD_STOP = 2, CMD_MAX, }; @@ -665,6 +666,11 @@ static int handle_server_socket(struct daemon *daemon, int sock_fd) case CMD_SIGNAL: ret = cmd_session_kill(daemon, &cmd, out); break; + case CMD_STOP: + done = 1; + ret = 0; + pr_debug("perf daemon is exciting\n"); + break; default: break; } @@ -1151,6 +1157,27 @@ static int __cmd_signal(struct daemon *daemon, struct option parent_options[], return send_cmd(daemon, &cmd); } +static int __cmd_stop(struct daemon *daemon, struct option parent_options[], + int argc, const char **argv) +{ + struct option start_options[] = { + OPT_PARENT(parent_options), + OPT_END() + }; + union cmd cmd = { .cmd = CMD_STOP, }; + + argc = parse_options(argc, argv, start_options, daemon_usage, 0); + if (argc) + usage_with_options(daemon_usage, start_options); + + if (setup_config(daemon)) { + pr_err("failed: config not found\n"); + return -1; + } + + return send_cmd(daemon, &cmd); +} + int cmd_daemon(int argc, const char **argv) { struct option daemon_options[] = { @@ -1175,6 +1202,8 @@ int cmd_daemon(int argc, const char **argv) return __cmd_start(&__daemon, daemon_options, argc, argv); if (!strcmp(argv[0], "signal")) return __cmd_signal(&__daemon, daemon_options, argc, argv); + else if (!strcmp(argv[0], "stop")) + return __cmd_stop(&__daemon, daemon_options, argc, argv); pr_err("failed: unknown command '%s'\n", argv[0]); return -1; |