perf auxtrace: Add option to synthesize branch stacks on samples
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 25 Sep 2015 13:15:39 +0000 (16:15 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 28 Sep 2015 19:53:44 +0000 (16:53 -0300)
Add AUX area tracing option 'l' to synthesize branch stacks on samples
just like sample type PERF_SAMPLE_BRANCH_STACK.  This is taken into use
by Intel PT in a subsequent patch.

Based-on-patch-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/1443186956-18718-9-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/itrace.txt
tools/perf/util/auxtrace.c
tools/perf/util/auxtrace.h

index 2ff946677e3b81b15be4d0d3a4782327d80daccc..65453f4c700604f8a259df384c6e52988ce81b14 100644 (file)
@@ -6,6 +6,7 @@
                e       synthesize error events
                d       create a debug log
                g       synthesize a call chain (use with i or x)
+               l       synthesize last branch entries (use with i or x)
 
        The default is all events i.e. the same as --itrace=ibxe
 
@@ -20,3 +21,6 @@
 
        Also the call chain size (default 16, max. 1024) for instructions or
        transactions events can be specified.
+
+       Also the number of last branch entries (default 64, max. 1024) for
+       instructions or transactions events can be specified.
index c4993b2e6c50e33909c6f262b0c21d8cce2a830f..7f10430af39c3ac9e47f4da1aca93e37a8f9cf87 100644 (file)
@@ -926,6 +926,8 @@ s64 perf_event__process_auxtrace(struct perf_tool *tool,
 #define PERF_ITRACE_DEFAULT_PERIOD             100000
 #define PERF_ITRACE_DEFAULT_CALLCHAIN_SZ       16
 #define PERF_ITRACE_MAX_CALLCHAIN_SZ           1024
+#define PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ     64
+#define PERF_ITRACE_MAX_LAST_BRANCH_SZ         1024
 
 void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts)
 {
@@ -936,6 +938,7 @@ void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts)
        synth_opts->period_type = PERF_ITRACE_DEFAULT_PERIOD_TYPE;
        synth_opts->period = PERF_ITRACE_DEFAULT_PERIOD;
        synth_opts->callchain_sz = PERF_ITRACE_DEFAULT_CALLCHAIN_SZ;
+       synth_opts->last_branch_sz = PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ;
 }
 
 /*
@@ -1043,6 +1046,23 @@ int itrace_parse_synth_opts(const struct option *opt, const char *str,
                                synth_opts->callchain_sz = val;
                        }
                        break;
+               case 'l':
+                       synth_opts->last_branch = true;
+                       synth_opts->last_branch_sz =
+                                       PERF_ITRACE_DEFAULT_LAST_BRANCH_SZ;
+                       while (*p == ' ' || *p == ',')
+                               p += 1;
+                       if (isdigit(*p)) {
+                               unsigned int val;
+
+                               val = strtoul(p, &endptr, 10);
+                               p = endptr;
+                               if (!val ||
+                                   val > PERF_ITRACE_MAX_LAST_BRANCH_SZ)
+                                       goto out_err;
+                               synth_opts->last_branch_sz = val;
+                       }
+                       break;
                case ' ':
                case ',':
                        break;
index bf72b77a588a60b330a8af18622ba8cd9a371bf5..b86f90db1352a6c8635e3ea5d02aa3c21bccc323 100644 (file)
@@ -63,7 +63,9 @@ enum itrace_period_type {
  * @calls: limit branch samples to calls (can be combined with @returns)
  * @returns: limit branch samples to returns (can be combined with @calls)
  * @callchain: add callchain to 'instructions' events
+ * @last_branch: add branch context to 'instruction' events
  * @callchain_sz: maximum callchain size
+ * @last_branch_sz: branch context size
  * @period: 'instructions' events period
  * @period_type: 'instructions' events period type
  */
@@ -79,7 +81,9 @@ struct itrace_synth_opts {
        bool                    calls;
        bool                    returns;
        bool                    callchain;
+       bool                    last_branch;
        unsigned int            callchain_sz;
+       unsigned int            last_branch_sz;
        unsigned long long      period;
        enum itrace_period_type period_type;
 };