perf script: Enhance sample flags for trace begin / end
authorAdrian Hunter <adrian.hunter@intel.com>
Thu, 20 Sep 2018 13:00:43 +0000 (16:00 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 20 Sep 2018 14:09:55 +0000 (11:09 -0300)
Allow for different combinations of sample flags with "trace begin" or
"trace end".

Previously, the Intel PT decoder would indicate begin / end by a branch
from / to zero. That hides useful information, in particular when a
trace ends with a call. Before remedying that, prepare 'perf script' to
display sample flags with more combinations that include trace begin /
end. In those cases display 'tr start' and 'tr end' separately.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/20180920130048.31432-2-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-script.c

index 7732346bd9dd45a1281188e00394fa55564649b2..4da5e32b9e035a97a797836f88a562c3a8206a2e 100644 (file)
@@ -1262,6 +1262,18 @@ static struct {
        {0, NULL}
 };
 
+static const char *sample_flags_to_name(u32 flags)
+{
+       int i;
+
+       for (i = 0; sample_flags[i].name ; i++) {
+               if (sample_flags[i].flags == flags)
+                       return sample_flags[i].name;
+       }
+
+       return NULL;
+}
+
 static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
 {
        const char *chars = PERF_IP_FLAG_CHARS;
@@ -1271,11 +1283,20 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
        char str[33];
        int i, pos = 0;
 
-       for (i = 0; sample_flags[i].name ; i++) {
-               if (sample_flags[i].flags == (flags & ~PERF_IP_FLAG_IN_TX)) {
-                       name = sample_flags[i].name;
-                       break;
-               }
+       name = sample_flags_to_name(flags & ~PERF_IP_FLAG_IN_TX);
+       if (name)
+               return fprintf(fp, "  %-15s%4s ", name, in_tx ? "(x)" : "");
+
+       if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
+               name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_BEGIN));
+               if (name)
+                       return fprintf(fp, "  tr strt %-7s%4s ", name, in_tx ? "(x)" : "");
+       }
+
+       if (flags & PERF_IP_FLAG_TRACE_END) {
+               name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_END));
+               if (name)
+                       return fprintf(fp, "  tr end  %-7s%4s ", name, in_tx ? "(x)" : "");
        }
 
        for (i = 0; i < n; i++, flags >>= 1) {
@@ -1288,10 +1309,7 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
        }
        str[pos] = 0;
 
-       if (name)
-               return fprintf(fp, "  %-7s%4s ", name, in_tx ? "(x)" : "");
-
-       return fprintf(fp, "  %-11s ", str);
+       return fprintf(fp, "  %-19s ", str);
 }
 
 struct printer_data {