[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1451963027-16973-4-git-send-email-namhyung@kernel.org>
Date: Tue, 5 Jan 2016 12:03:46 +0900
From: Namhyung Kim <namhyung@...nel.org>
To: Arnaldo Carvalho de Melo <acme@...nel.org>
Cc: Ingo Molnar <mingo@...nel.org>,
Peter Zijlstra <a.p.zijlstra@...llo.nl>,
Jiri Olsa <jolsa@...hat.com>,
LKML <linux-kernel@...r.kernel.org>,
David Ahern <dsahern@...il.com>,
Steven Rostedt <rostedt@...dmis.org>,
Frederic Weisbecker <fweisbec@...il.com>,
Andi Kleen <andi@...stfloor.org>,
Wang Nan <wangnan0@...wei.com>
Subject: [PATCH 4/5] perf tools: Support dynamic sort keys for -F/--fields
Now dynamic sort keys are supported for tracepoint events, add it to
output fields too.
Signed-off-by: Namhyung Kim <namhyung@...nel.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 9618a64875c0..65ae0487da5a 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1919,7 +1919,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;
@@ -1929,18 +1929,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;
@@ -1949,7 +1955,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;
@@ -1958,7 +1965,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;
}
@@ -1966,7 +1973,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;
@@ -1980,14 +1988,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;
@@ -2017,12 +2027,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;
}
@@ -2040,7 +2051,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) {
@@ -2049,7 +2060,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:
@@ -2193,7 +2205,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;
@@ -2398,7 +2410,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;
@@ -2438,6 +2450,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;
}
@@ -2463,7 +2478,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;
@@ -2487,7 +2502,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;
@@ -2524,7 +2539,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 majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists