Now dynamic sort keys are supported for tracepoint events, add it to
output fields too.

Signed-off-by: Namhyung Kim <namhy...@kernel.org>
---
 tools/perf/util/sort.c | 51 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 4d05b13aeac8..c09b34f545c6 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1953,7 +1953,7 @@ static struct perf_evsel *find_evsel(struct perf_evlist 
*evlist, char *event_nam
 
 static int __dynamic_dimension__add(struct perf_evsel *evsel,
                                    struct format_field *field,
-                                   bool raw_trace)
+                                   bool raw_trace, bool is_sort_key)
 {
        struct hpp_dynamic_entry *hde;
 
@@ -1963,18 +1963,24 @@ static int __dynamic_dimension__add(struct perf_evsel 
*evsel,
 
        hde->raw_trace = raw_trace;
 
-       perf_hpp__register_sort_field(&hde->hpp);
+       if (is_sort_key)
+               perf_hpp__register_sort_field(&hde->hpp);
+       else
+               perf_hpp__column_register(&hde->hpp);
+
        return 0;
 }
 
-static int add_evsel_fields(struct perf_evsel *evsel, bool raw_trace)
+static int add_evsel_fields(struct perf_evsel *evsel, bool raw_trace,
+                           bool is_sort_key)
 {
        int ret;
        struct format_field *field;
 
        field = evsel->tp_format->format.fields;
        while (field) {
-               ret = __dynamic_dimension__add(evsel, field, raw_trace);
+               ret = __dynamic_dimension__add(evsel, field, raw_trace,
+                                              is_sort_key);
                if (ret < 0)
                        return ret;
 
@@ -1983,7 +1989,8 @@ static int add_evsel_fields(struct perf_evsel *evsel, 
bool raw_trace)
        return 0;
 }
 
-static int add_all_dynamic_fields(struct perf_evlist *evlist, bool raw_trace)
+static int add_all_dynamic_fields(struct perf_evlist *evlist, bool raw_trace,
+                                 bool is_sort_key)
 {
        int ret;
        struct perf_evsel *evsel;
@@ -1992,7 +1999,7 @@ static int add_all_dynamic_fields(struct perf_evlist 
*evlist, bool raw_trace)
                if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
                        continue;
 
-               ret = add_evsel_fields(evsel, raw_trace);
+               ret = add_evsel_fields(evsel, raw_trace, is_sort_key);
                if (ret < 0)
                        return ret;
        }
@@ -2000,7 +2007,8 @@ static int add_all_dynamic_fields(struct perf_evlist 
*evlist, bool raw_trace)
 }
 
 static int add_all_matching_fields(struct perf_evlist *evlist,
-                                  char *field_name, bool raw_trace)
+                                  char *field_name, bool raw_trace,
+                                  bool is_sort_key)
 {
        int ret = -ESRCH;
        struct perf_evsel *evsel;
@@ -2014,14 +2022,16 @@ static int add_all_matching_fields(struct perf_evlist 
*evlist,
                if (field == NULL)
                        continue;
 
-               ret = __dynamic_dimension__add(evsel, field, raw_trace);
+               ret = __dynamic_dimension__add(evsel, field, raw_trace,
+                                              is_sort_key);
                if (ret < 0)
                        break;
        }
        return ret;
 }
 
-static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
+static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok,
+                            bool is_sort_key)
 {
        char *str, *event_name, *field_name, *opt_name;
        struct perf_evsel *evsel;
@@ -2051,12 +2061,13 @@ static int add_dynamic_entry(struct perf_evlist 
*evlist, const char *tok)
        }
 
        if (!strcmp(field_name, "trace_fields")) {
-               ret = add_all_dynamic_fields(evlist, raw_trace);
+               ret = add_all_dynamic_fields(evlist, raw_trace, is_sort_key);
                goto out;
        }
 
        if (event_name == NULL) {
-               ret = add_all_matching_fields(evlist, field_name, raw_trace);
+               ret = add_all_matching_fields(evlist, field_name, raw_trace,
+                                             is_sort_key);
                goto out;
        }
 
@@ -2074,7 +2085,7 @@ static int add_dynamic_entry(struct perf_evlist *evlist, 
const char *tok)
        }
 
        if (!strcmp(field_name, "*")) {
-               ret = add_evsel_fields(evsel, raw_trace);
+               ret = add_evsel_fields(evsel, raw_trace, is_sort_key);
        } else {
                field = pevent_find_any_field(evsel->tp_format, field_name);
                if (field == NULL) {
@@ -2083,7 +2094,8 @@ static int add_dynamic_entry(struct perf_evlist *evlist, 
const char *tok)
                        return -ENOENT;
                }
 
-               ret = __dynamic_dimension__add(evsel, field, raw_trace);
+               ret = __dynamic_dimension__add(evsel, field, raw_trace,
+                                              is_sort_key);
        }
 
 out:
@@ -2227,7 +2239,7 @@ static int sort_dimension__add(const char *tok,
                return 0;
        }
 
-       if (!add_dynamic_entry(evlist, tok))
+       if (!add_dynamic_entry(evlist, tok, true))
                return 0;
 
        return -ESRCH;
@@ -2435,7 +2447,7 @@ void sort__setup_elide(FILE *output)
        }
 }
 
-static int output_field_add(char *tok)
+static int output_field_add(struct perf_evlist *evlist, char *tok)
 {
        unsigned int i;
 
@@ -2475,6 +2487,9 @@ static int output_field_add(char *tok)
                return __sort_dimension__add_output(sd);
        }
 
+       if (!add_dynamic_entry(evlist, tok, false))
+               return 0;
+
        return -ESRCH;
 }
 
@@ -2500,7 +2515,7 @@ bool is_strict_order(const char *order)
        return order && (*order != '+');
 }
 
-static int __setup_output_field(void)
+static int __setup_output_field(struct perf_evlist *evlist)
 {
        char *tmp, *tok, *str, *strp;
        int ret = -EINVAL;
@@ -2524,7 +2539,7 @@ static int __setup_output_field(void)
 
        for (tok = strtok_r(strp, ", ", &tmp);
                        tok; tok = strtok_r(NULL, ", ", &tmp)) {
-               ret = output_field_add(tok);
+               ret = output_field_add(evlist, tok);
                if (ret == -EINVAL) {
                        error("Invalid --fields key: `%s'", tok);
                        break;
@@ -2561,7 +2576,7 @@ int setup_sorting(struct perf_evlist *evlist)
        if (sort__mode != SORT_MODE__DIFF)
                perf_hpp__init();
 
-       err = __setup_output_field();
+       err = __setup_output_field(evlist);
        if (err < 0)
                return err;
 
-- 
2.6.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
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