• Jiri Olsa's avatar
    perf tools: Allow to enable/disable events via control file · 991ae4eb
    Jiri Olsa authored
    Adding new control events to enable/disable specific event.
    The interface string for control file are:
    
      'enable <EVENT NAME>'
      'disable <EVENT NAME>'
    
    when received the command, perf will scan the current evlist
    for <EVENT NAME> and if found it's enabled/disabled.
    
    Example session:
    
      terminal 1:
        # mkfifo control ack perf.pipe
        # perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:*' -o - > perf.pipe
    
      terminal 2:
        # cat perf.pipe | perf --no-pager script -i -
    
      terminal 1:
        Events disabled
    
      NOTE Above message will show only after read side of the pipe ('>')
      is started on 'terminal 2'. The 'terminal 1's bash does not execute
      perf before that, hence the delyaed perf record message.
    
      terminal 3:
        # echo 'enable sched:sched_process_fork' > control
    
      terminal 1:
        event sched:sched_process_fork enabled
    
      terminal 2:
        bash 33349 [034] 149587.674295: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34056
        bash 33349 [034] 149588.239521: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34057
    
      terminal 3:
        # echo 'enable sched:sched_wakeup_new' > control
    
      terminal 1:
        event sched:sched_wakeup_new enabled
    
      terminal 2:
        bash 33349 [034] 149632.228023: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34059
        bash 33349 [034] 149632.228050:   sched:sched_wakeup_new: bash:34059 [120] success=1 CPU:036
        bash 33349 [034] 149633.950005: sched:sched_process_fork: comm=bash pid=33349 child_comm=bash child_pid=34060
        bash 33349 [034] 149633.950030:   sched:sched_wakeup_new: bash:34060 [120] success=1 CPU:036
    
    Committer testing:
    
    If I use 'sched:*' and then enable all events, I can't get 'perf record'
    to react to further commands, so I tested it with:
    
      [root@five ~]# perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:sched_process_*' -o - > perf.pipe
      Events disabled
      Events enabled
      Events disabled
    
    And then it works as expected, so we need to fix this pre-existing
    problem.
    
    Another issue, we need to check if a event is already enabled or
    disabled and change the message to be clearer, i.e.:
    
      [root@five ~]# perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:sched_process_*' -o - > perf.pipe
      Events disabled
    
    If we receive a 'disable' command, then it should say:
    
      [root@five ~]# perf record --control=fifo:control,ack -D -1 --no-buffering -e 'sched:sched_process_*' -o - > perf.pipe
      Events disabled
      Events already disabled
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Acked-by: default avatarNamhyung 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-2-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    991ae4eb
evlist.c 45.5 KB