Support '*' character for field name to add all (non-common) fields as
sort keys easily.

  $ perf report -s 'switch.*' --stdio
  ...
  # Overhead    prev_comm  prev_pid   prev_prio  prev_state     next_comm  
next_pid  next_prio
  # ........  ...........  .........  .........  ..........  ............  
........  .........
  #
       3.82%    swapper/0         0         120           0   netctl-auto     
18711        120
       3.75%  netctl-auto     18711         120           1     swapper/0       
  0        120
       2.24%    swapper/1         0         120           0   netctl-auto     
18709        120
       2.24%  netctl-auto     18709         120           1     swapper/1       
  0        120
       1.80%    swapper/2         0         120           0   rcu_preempt       
  7        120
       1.80%    swapper/2         0         120           0   netctl-auto     
18711        120
       1.80%  rcu_preempt         7         120           1     swapper/2       
  0        120
       1.80%  netctl-auto     18711         120           1     swapper/2       
  0        120
  ...

Suggested-by: Jiri Olsa <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
 tools/perf/util/sort.c | 49 ++++++++++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 78496f0555ec..297383e0abc5 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1907,12 +1907,27 @@ static struct perf_evsel *find_evsel(struct perf_evlist 
*evlist, char *event_nam
        return evsel;
 }
 
+static int __dynamic_dimension__add(struct perf_evsel *evsel,
+                                   struct format_field *field,
+                                   bool raw_trace)
+{
+       struct hpp_dynamic_entry *hde;
+
+       hde = __alloc_dynamic_entry(evsel, field);
+       if (hde == NULL)
+               return -ENOMEM;
+
+       hde->raw_trace = raw_trace;
+
+       perf_hpp__register_sort_field(&hde->hpp);
+       return 0;
+}
+
 static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
 {
        char *str, *event_name, *field_name, *opt_name;
        struct perf_evsel *evsel;
        struct format_field *field;
-       struct hpp_dynamic_entry *hde;
        bool raw_trace = symbol_conf.raw_trace;
        int ret = 0;
 
@@ -1950,22 +1965,26 @@ static int add_dynamic_entry(struct perf_evlist 
*evlist, const char *tok)
                goto out;
        }
 
-       field = pevent_find_any_field(evsel->tp_format, field_name);
-       if (field == NULL) {
-               pr_debug("Cannot find event field for %s.%s\n",
-                      event_name, field_name);
-               ret = -ENOENT;
-               goto out;
-       }
+       if (!strcmp(field_name, "*")) {
+               field = evsel->tp_format->format.fields;
 
-       hde = __alloc_dynamic_entry(evsel, field);
-       if (hde == NULL) {
-               ret = -ENOMEM;
-               goto out;
-       }
-       hde->raw_trace = raw_trace;
+               while (field) {
+                       ret = __dynamic_dimension__add(evsel, field, raw_trace);
+                       if (ret < 0)
+                               goto out;
 
-       perf_hpp__register_sort_field(&hde->hpp);
+                       field = field->next;
+               }
+       } else {
+               field = pevent_find_any_field(evsel->tp_format, field_name);
+               if (field == NULL) {
+                       pr_debug("Cannot find event field for %s.%s\n",
+                                event_name, field_name);
+                       return -ENOENT;
+               }
+
+               ret = __dynamic_dimension__add(evsel, field, raw_trace);
+       }
 
 out:
        free(str);
-- 
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