The 'trace_fields' sort key is similar as 'trace' sort key, but it shows
each fields separately.  Each event will get different columns as their
fields.

  $ perf report -s trace_fields --stdio
  # To display the perf.data header info, please use --header/--header-only 
options.
  #
  #
  # Total Lost Samples: 0
  #
  # Samples: 20K of event 'kmem:kmalloc'
  # Event count (approx.): 20533
  #
  # Overhead  Command           call_site                 ptr  bytes_req  
bytes_alloc            gfp_flags
  # ........  .......  ..................  ..................  .........  
...........  ...................
  #
      99.89%  perf       ffffffffa01d4396  0xffff8803ffb79720         96        
   96    GFP_NOFS|GFP_ZERO
       0.06%  sleep      ffffffff8114e1cd  0xffff8803d228a000       4096        
 4096           GFP_KERNEL
       0.03%  perf       ffffffff811d6ae6  0xffff8803f7678f00        240        
  256  GFP_KERNEL|GFP_ZERO
       0.00%  perf       ffffffff812263c1  0xffff880406172380        128        
  128           GFP_KERNEL
       0.00%  perf       ffffffff812264b9  0xffff8803ffac1600        504        
  512           GFP_KERNEL
       0.00%  perf       ffffffff81226634  0xffff880401dc5280         28        
   32           GFP_KERNEL
       0.00%  sleep      ffffffff81226da9  0xffff8803ffac3a00        392        
  512           GFP_KERNEL

  # Samples: 20K of event 'kmem:kfree'
  # Event count (approx.): 20597
  #
  # Overhead           call_site                 ptr
  # ........  ..................  ..................
  #
      99.58%    ffffffffa01d85ad  0xffff8803ffb79720
       0.07%    ffffffff81443f5c  0xffff8803f7669400
       0.02%    ffffffff811d5753  0xffff8803f7678f00
       0.01%    ffffffff81443f5c  0xffff8803f766be00
       0.01%    ffffffff8114e359  0xffff8803d228a000
       0.01%    ffffffff81443f5c  0xffff8800d156dc00
       0.01%    ffffffff81443f5c  0xffff8803f7669400
       0.01%    ffffffff8114e359  0xffff8803d228a000
       0.01%    ffffffff8114e359  0xffff8803d228a000
       0.01%    ffffffff8114e359  0xffff8803d228a000

Signed-off-by: Namhyung Kim <[email protected]>
---
 tools/perf/util/sort.c | 44 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 58a84a1c889a..ae995f37e135 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1931,6 +1931,35 @@ static int __dynamic_dimension__add(struct perf_evsel 
*evsel,
        return 0;
 }
 
+static int add_evsel_fields(struct perf_evsel *evsel, bool raw_trace)
+{
+       int ret;
+       struct format_field *field;
+
+       field = evsel->tp_format->format.fields;
+       while (field) {
+               ret = __dynamic_dimension__add(evsel, field, raw_trace);
+               if (ret < 0)
+                       return ret;
+
+               field = field->next;
+       }
+       return 0;
+}
+
+static int add_all_dynamic_fields(struct perf_evlist *evlist, bool raw_trace)
+{
+       int ret;
+       struct perf_evsel *evsel;
+
+       evlist__for_each(evlist, evsel) {
+               ret = add_evsel_fields(evsel, raw_trace);
+               if (ret < 0)
+                       return ret;
+       }
+       return 0;
+}
+
 static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
 {
        char *str, *event_name, *field_name, *opt_name;
@@ -1960,6 +1989,11 @@ static int add_dynamic_entry(struct perf_evlist *evlist, 
const char *tok)
                raw_trace = true;
        }
 
+       if (!strcmp(field_name, "trace_fields")) {
+               ret = add_all_dynamic_fields(evlist ,raw_trace);
+               goto out;
+       }
+
        evsel = find_evsel(evlist, event_name);
        if (evsel == NULL) {
                pr_debug("Cannot find event: %s\n", event_name);
@@ -1974,15 +2008,7 @@ static int add_dynamic_entry(struct perf_evlist *evlist, 
const char *tok)
        }
 
        if (!strcmp(field_name, "*")) {
-               field = evsel->tp_format->format.fields;
-
-               while (field) {
-                       ret = __dynamic_dimension__add(evsel, field, raw_trace);
-                       if (ret < 0)
-                               goto out;
-
-                       field = field->next;
-               }
+               ret = add_evsel_fields(evsel, raw_trace);
        } else {
                field = pevent_find_any_field(evsel->tp_format, field_name);
                if (field == NULL) {
-- 
2.6.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to