• Arnaldo Carvalho de Melo's avatar
    perf evsel: Introduce per event max_events property · 2fda5ada
    Arnaldo Carvalho de Melo authored
    This simply adds the field to 'struct perf_evsel' and allows setting
    it via the event parser, to test it lets trace trace:
    
    First look at where in a function that receives an evsel we can put a probe
    to read how evsel->max_events was setup:
    
      # perf probe -x ~/bin/perf -L trace__event_handler
      <trace__event_handler@/home/acme/git/perf/tools/perf/builtin-trace.c:0>
            0  static int trace__event_handler(struct trace *trace, struct perf_evsel *evsel,
                                              union perf_event *event __maybe_unused,
                                              struct perf_sample *sample)
            3  {
            4         struct thread *thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
            5         int callchain_ret = 0;
    
            7         if (sample->callchain) {
            8                 callchain_ret = trace__resolve_callchain(trace, evsel, sample, &callchain_cursor);
            9                 if (callchain_ret == 0) {
           10                         if (callchain_cursor.nr < trace->min_stack)
           11                                 goto out;
           12                         callchain_ret = 1;
                              }
                      }
    
    See what variables we can probe at line 7:
    
      # perf probe -x ~/bin/perf -V trace__event_handler:7
      Available variables at trace__event_handler:7
              @<trace__event_handler+89>
                      int     callchain_ret
                      struct perf_evsel*      evsel
                      struct perf_sample*     sample
                      struct thread*  thread
                      struct trace*   trace
                      union perf_event*       event
    
    Add a probe at that line asking for evsel->max_events to be collected and named
    as "max_events":
    
      # perf probe -x ~/bin/perf trace__event_handler:7 'max_events=evsel->max_events'
      Added new event:
        probe_perf:trace__event_handler (on trace__event_handler:7 in /home/acme/bin/perf with max_events=evsel->max_events)
    
      You can now use it in all perf tools, such as:
    
      	perf record -e probe_perf:trace__event_handler -aR sleep 1
    
    Now use 'perf trace', here aliased to just 'trace' and trace trace, i.e.
    the first 'trace' is tracing just that 'probe_perf:trace__event_handler' event,
    while the traced trace is tracing all scheduler tracepoints, will stop at two
    events (--max-events 2) and will just set evsel->max_events for all the sched
    tracepoints to 9, we will see the output of both traces intermixed:
    
      # trace -e *perf:*event_handler trace --max-events 2 -e sched:*/nr=9/
           0.000 :0/0 sched:sched_waking:comm=rcu_sched pid=10 prio=120 target_cpu=000
           0.009 :0/0 sched:sched_wakeup:comm=rcu_sched pid=10 prio=120 target_cpu=000
           0.000 trace/23949 probe_perf:trace__event_handler:(48c34a) max_events=0x9
           0.046 trace/23949 probe_perf:trace__event_handler:(48c34a) max_events=0x9
      #
    
    Now, if the traced trace sends its output to /dev/null, we'll see just
    what the first level trace outputs: that evsel->max_events is indeed
    being set to 9:
    
      # trace -e *perf:*event_handler trace -o /dev/null --max-events 2 -e sched:*/nr=9/
           0.000 trace/23961 probe_perf:trace__event_handler:(48c34a) max_events=0x9
           0.030 trace/23961 probe_perf:trace__event_handler:(48c34a) max_events=0x9
      #
    
    Now that we can set evsel->max_events, we can go to the next step, honour that
    per-event property in 'perf trace'.
    
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Milian Wolff <milian.wolff@kdab.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: https://lkml.kernel.org/n/tip-og00yasj276joem6e14l1eas@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    2fda5ada
evsel.h 14.2 KB