perf tools: Add 'stop' control command
authorJiri Olsa <jolsa@kernel.org>
Sat, 26 Dec 2020 23:20:37 +0000 (00:20 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 20 Jan 2021 17:34:21 +0000 (14:34 -0300)
Adding control 'stop' command to stop perf record.

When it is received, perf will set the 'done' variable to 1 to stop its
mmap ring buffer reading loop.

Example session:

  terminal 1:
    # mkfifo control ack
    # perf record --control=fifo:control,ack

  terminal 2:
    # echo stop > control

  terminal 1:
    [ perf record: Woken up 7 times to write data ]
    [ perf record: Captured and wrote 3.214 MB perf.data (38280 samples) ]
    #

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lore.kernel.org/lkml/20201226232038.390883-4-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-record.txt
tools/perf/builtin-record.c
tools/perf/builtin-stat.c
tools/perf/util/evlist.c
tools/perf/util/evlist.h

index 3405268bd9a5e1a43ab03c29e7541bde193426b5..c0ee766bca050ae88e1467cd057ef39f9a15fff4 100644 (file)
@@ -651,6 +651,7 @@ Available commands:
   'enable name'      : enable event 'name'
   'disable name'     : disable event 'name'
   'snapshot'         : AUX area tracing snapshot).
+  'stop'             : stop perf record
 
   'evlist [-v|-g|-F] : display all events
                        -F  Show just the sample frequency used for each event.
index a0e832002ecab2c8609b115d1be9a54db76c756b..36fc71097822ccfc4ada6999e8acce7b1d416d54 100644 (file)
@@ -1942,6 +1942,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
                                hit_auxtrace_snapshot_trigger(rec);
                                evlist__ctlfd_ack(rec->evlist);
                                break;
+                       case EVLIST_CTL_CMD_STOP:
+                               done = 1;
+                               break;
                        case EVLIST_CTL_CMD_ACK:
                        case EVLIST_CTL_CMD_UNSUPPORTED:
                        case EVLIST_CTL_CMD_ENABLE:
index fc535e2df85798a931364d856cf113b9eafa9e66..46a3f4ab13715858591692688c7f3aca1322c79a 100644 (file)
@@ -622,6 +622,7 @@ static void process_evlist(struct evlist *evlist, unsigned int interval)
                case EVLIST_CTL_CMD_ACK:
                case EVLIST_CTL_CMD_UNSUPPORTED:
                case EVLIST_CTL_CMD_EVLIST:
+               case EVLIST_CTL_CMD_STOP:
                default:
                        break;
                }
index 9e890b482220ab0d25f5ec69ddc616495ad93683..c6de70cefbaee6287ae7f2bcfab470c426ef8ace 100644 (file)
@@ -1940,6 +1940,9 @@ static int evlist__ctlfd_recv(struct evlist *evlist, enum evlist_ctl_cmd *cmd,
                } else if (!strncmp(cmd_data, EVLIST_CTL_CMD_EVLIST_TAG,
                                    (sizeof(EVLIST_CTL_CMD_EVLIST_TAG)-1))) {
                        *cmd = EVLIST_CTL_CMD_EVLIST;
+               } else if (!strncmp(cmd_data, EVLIST_CTL_CMD_STOP_TAG,
+                                   (sizeof(EVLIST_CTL_CMD_STOP_TAG)-1))) {
+                       *cmd = EVLIST_CTL_CMD_STOP;
                }
        }
 
@@ -2077,6 +2080,7 @@ int evlist__ctlfd_process(struct evlist *evlist, enum evlist_ctl_cmd *cmd)
                                err = evlist__ctlfd_list(evlist, cmd_data);
                                break;
                        case EVLIST_CTL_CMD_SNAPSHOT:
+                       case EVLIST_CTL_CMD_STOP:
                                break;
                        case EVLIST_CTL_CMD_ACK:
                        case EVLIST_CTL_CMD_UNSUPPORTED:
index e79c64d81d212cb6bb36eccf6cc98c774393d5bc..6f45c3630355bce1f75c701fdcf72c348c976b31 100644 (file)
@@ -331,6 +331,7 @@ struct evsel *evlist__reset_weak_group(struct evlist *evlist, struct evsel *evse
 #define EVLIST_CTL_CMD_ACK_TAG     "ack\n"
 #define EVLIST_CTL_CMD_SNAPSHOT_TAG "snapshot"
 #define EVLIST_CTL_CMD_EVLIST_TAG "evlist"
+#define EVLIST_CTL_CMD_STOP_TAG "stop"
 
 #define EVLIST_CTL_CMD_MAX_LEN 64
 
@@ -341,6 +342,7 @@ enum evlist_ctl_cmd {
        EVLIST_CTL_CMD_ACK,
        EVLIST_CTL_CMD_SNAPSHOT,
        EVLIST_CTL_CMD_EVLIST,
+       EVLIST_CTL_CMD_STOP,
 };
 
 int evlist__parse_control(const char *str, int *ctl_fd, int *ctl_fd_ack, bool *ctl_fd_close);