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>
   '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.
 
                                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:
 
                case EVLIST_CTL_CMD_ACK:
                case EVLIST_CTL_CMD_UNSUPPORTED:
                case EVLIST_CTL_CMD_EVLIST:
+               case EVLIST_CTL_CMD_STOP:
                default:
                        break;
                }
 
                } 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;
                }
        }
 
                                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:
 
 #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
 
        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);