perf record: Synthesize features before events in pipe mode
Jiri Olsa
reviewerPATCH 1/2 perf record: Synthesize features before events in pipe mode
We need to synthesize events first, because some
features works on top of them (on report side).
--- tools/perf/builtin-record.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
tools/perf/builtin-record.c +11 -7
@@ -754,13 +754,10 @@ static int record__synthesize(struct record *rec, bool tail)return 0 ;if (data->is_pipe) { - err =perf_event__synthesize_features ( - tool, session, rec->evlist, process_synthesized_event); -if (err <0 ) { -pr_err ("Couldn't synthesize features.\n" ); -return err; - } - +/* +* We need to synthesize events first, because some +* features works on top of them (on report side). +*/ err =perf_event__synthesize_attrs (tool, session, process_synthesized_event);if (err <0 ) {
@@ -768,6 +765,13 @@ static int record__synthesize(struct record *rec, bool tail) goto out; } + err =perf_event__synthesize_features (tool, session, rec->evlist, + process_synthesized_event); +if (err <0 ) { +pr_err ("Couldn't synthesize features.\n" ); +return err; + } +if (have_tracepoints (&rec->evlist->entries)) {/* * FIXME err <= 0 here actually means that
Signature · 1 line
2.13.6
Jiri Olsa
reviewerPATCH 2/2 perf report: Support forced leader feature in pipe mode
Stephan reported a problem with forced leader in pipe mode, where report does not force the group output. The reason is that we don't force the leader in pipe mode.
This patch adds HEADER_LAST_FEATURE mark to have a point where we have all events and features received, and force the group if requested.
$ perf record --group -e '{cycles, instructions}' -o - kill | perf report -i - --groupSNIP
# Overhead Command Shared Object Symbol
# ................ ....... ................ .......................
#
28.36% 0.00% kill libc-2.25.so [.] __unregister_atfork
26.32% 0.00% kill libc-2.25.so [.] _dl_addr
26.10% 0.00% kill ld-2.25.so [.] _dl_relocate_object
17.32% 0.00% kill ld-2.25.so [.] __tunables_init
1.70% 0.01% kill [unknown] [k] 0xffffffffafa01a40
0.20% 0.00% kill ld-2.25.so [.] _start
0.00% 48.77% kill ld-2.25.so [.] do_lookup_x
0.00% 42.97% kill libc-2.25.so [.] _IO_getline
0.00% 6.35% kill ld-2.25.so [.] strcmp
0.00% 1.71% kill ld-2.25.so [.] _dl_sysdep_start
0.00% 0.19% kill ld-2.25.so [.] _dl_start--- tools/perf/builtin-report.c | 57 ++++++++++++++++++++++++++++++++++----------- tools/perf/util/header.c | 11 ++++++++- 2 files changed, 53 insertions(+), 15 deletions(-)
tools/perf/builtin-report.c +43 -14
@@ -68,6 +68,7 @@ struct report {bool header;bool header_only;bool nonany_branch_mode; +bool group_set;int max_stack;struct perf_read_values show_threads_values;const char *pretty_printing_style;
@@ -193,6 +194,45 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,return err; } +/* +* Events in data file are not collect in groups, but we still want +* the group display. Set the artificial group and set the leader's +* forced_leader flag to notify the display code. +*/ +static void setup_forced_leader (struct report *report, +struct perf_evlist *evlist) +{ +if (report->group_set && !evlist->nr_groups) { +struct perf_evsel *leader =perf_evlist__first (evlist); + +perf_evlist__set_leader (evlist); + leader->forced_leader = true; + } +} + +static int process_feature_event (struct perf_tool *tool, +union perf_event *event, +struct perf_session *session__maybe_unused ) +{ + struct report *rep = container_of(tool, struct report, tool); + +if (event->feat.feat_id <HEADER_LAST_FEATURE ) +return perf_event__process_feature (tool, event, session); + +if (event->feat.feat_id !=HEADER_LAST_FEATURE ) { +pr_err ("failed: wrong feature ID: %" PRIu64"\n" , + event->feat.feat_id); +return -1 ; + } + +/* +* All features are received, we can force the +* group if needed. +*/ +setup_forced_leader (rep, session->evlist); +return 0 ; +} + static int process_sample_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample,
@@ -940,7 +980,6 @@ int cmd_report(int argc, const char **argv)"perf report [<options>]" ,NULL }; -bool group_set = false;struct report report = { .tool = { .sample = process_sample_event,
@@ -958,7 +997,7 @@ int cmd_report(int argc, const char **argv) .id_index = perf_event__process_id_index, .auxtrace_info = perf_event__process_auxtrace_info, .auxtrace = perf_event__process_auxtrace, - .feature = perf_event__process_feature, + .feature = process_feature_event, .ordered_events = true, .ordering_requires_timestamps = true, },
@@ -1060,7 +1099,7 @@ int cmd_report(int argc, const char **argv) "Specify disassembler style (e.g. -M intel for intel syntax)"),OPT_BOOLEAN (0 ,"show-total-period" , &symbol_conf.show_total_period,"Show a column with the sum of periods" ), -OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &group_set, +OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &report.group_set,"Show event group information together" ), OPT_CALLBACK_NOOPT('b', "branch-stack", &branch_mode, "", "use branch records for per branch histogram filling",
@@ -1177,17 +1216,7 @@ int cmd_report(int argc, const char **argv) has_br_stack =perf_header__has_feat (&session->header,HEADER_BRANCH_STACK ); -/* -* Events in data file are not collect in groups, but we still want -* the group display. Set the artificial group and set the leader's -* forced_leader flag to notify the display code. -*/ -if (group_set && !session->evlist->nr_groups) { -struct perf_evsel *leader =perf_evlist__first (session->evlist); - -perf_evlist__set_leader (session->evlist); - leader->forced_leader = true; - } +setup_forced_leader (&report, session->evlist);if (itrace_synth_opts.last_branch) has_br_stack = true;
tools/perf/util/header.c +10 -1
@@ -3415,8 +3415,17 @@ int perf_event__synthesize_features(struct perf_tool *tool,return ret; } } + +/* Send HEADER_LAST_FEATURE mark. */ + fe = ff.buf; + fe->feat_id =HEADER_LAST_FEATURE ; + fe->header.type =PERF_RECORD_HEADER_FEATURE ; + fe->header.size =sizeof (*fe); + + ret =process (tool, ff.buf,NULL ,NULL ); +free (ff.buf); -return 0 ; +return ret; } int perf_event__process_feature(struct perf_tool *tool,
Signature · 1 line
2.13.6
Re: [PATCH 2/2] perf report: Support forced leader feature in pipe mode
Quoted 27 lines · Jiri Olsa
Stephan reported a problem with forced leader in pipe mode, where report does not force the group output. The reason is that we don't force the leader in pipe mode.
This patch adds
HEADER_LAST_FEATUREmark to have a point where we have all events and features received, and force the group if requested.$ perf record --group -e '{cycles, instructions}' -o - kill | perf report -i - --groupSNIP
# Overhead Command Shared Object Symbol # ................ ....... ................ ....................... # 28.36% 0.00% kill libc-2.25.so [.] __unregister_atfork 26.32% 0.00% kill libc-2.25.so [.] _dl_addr 26.10% 0.00% kill ld-2.25.so [.] _dl_relocate_object 17.32% 0.00% kill ld-2.25.so [.] __tunables_init 1.70% 0.01% kill [unknown] [k] 0xffffffffafa01a40 0.20% 0.00% kill ld-2.25.so [.] _start 0.00% 48.77% kill ld-2.25.so [.] do_lookup_x 0.00% 42.97% kill libc-2.25.so [.] _IO_getline 0.00% 6.35% kill ld-2.25.so [.] strcmp 0.00% 1.71% kill ld-2.25.so [.] _dl_sysdep_start 0.00% 0.19% kill ld-2.25.so [.] _dl_start
Quoted 2 lines
Signed-off-by Jiri Olsa <[email protected]>
Works for me.
Thanks.
Quoted 134 lines
--- tools/perf/builtin-report.c | 57 ++++++++++++++++++++++++++++++++++----------- tools/perf/util/header.c | 11 ++++++++- 2 files changed, 53 insertions(+), 15 deletions(-)tools/perf/builtin-report.c +43
-14@@ -68,6 +68,7 @@ struct report {bool header;bool header_only;bool nonany_branch_mode; +bool group_set;int max_stack;struct perf_read_values show_threads_values;const char *pretty_printing_style;@@ -193,6 +194,45 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,return err; } +/* +* Events in data file are not collect in groups, but we still want +* the group display. Set the artificial group and set the leader's +* forced_leader flag to notify the display code. +*/ +static void setup_forced_leader (struct report *report, +struct perf_evlist *evlist) +{ +if (report->group_set && !evlist->nr_groups) { +struct perf_evsel *leader =perf_evlist__first (evlist); + +perf_evlist__set_leader (evlist); + leader->forced_leader = true; + } +} + +static int process_feature_event (struct perf_tool *tool, +union perf_event *event, +struct perf_session *session__maybe_unused ) +{ + struct report *rep = container_of(tool, struct report, tool); + +if (event->feat.feat_id <HEADER_LAST_FEATURE ) +return perf_event__process_feature (tool, event, session); + +if (event->feat.feat_id !=HEADER_LAST_FEATURE ) { +pr_err ("failed: wrong feature ID: %" PRIu64"\n" , + event->feat.feat_id); +return -1 ; + } + +/* +* All features are received, we can force the +* group if needed. +*/ +setup_forced_leader (rep, session->evlist); +return 0 ; +} + static int process_sample_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample,@@ -940,7 +980,6 @@ int cmd_report(int argc, const char **argv)"perf report [<options>]" ,NULL }; -bool group_set = false;struct report report = { .tool = { .sample = process_sample_event,@@ -958,7 +997,7 @@ int cmd_report(int argc, const char **argv) .id_index = perf_event__process_id_index, .auxtrace_info = perf_event__process_auxtrace_info, .auxtrace = perf_event__process_auxtrace, - .feature = perf_event__process_feature, + .feature = process_feature_event, .ordered_events = true, .ordering_requires_timestamps = true, },@@ -1060,7 +1099,7 @@ int cmd_report(int argc, const char **argv) "Specify disassembler style (e.g. -M intel for intel syntax)"),OPT_BOOLEAN (0 ,"show-total-period" , &symbol_conf.show_total_period,"Show a column with the sum of periods" ), -OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &group_set, +OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &report.group_set,"Show event group information together" ), OPT_CALLBACK_NOOPT('b', "branch-stack", &branch_mode, "", "use branch records for per branch histogram filling",@@ -1177,17 +1216,7 @@ int cmd_report(int argc, const char **argv) has_br_stack =perf_header__has_feat (&session->header,HEADER_BRANCH_STACK ); -/* -* Events in data file are not collect in groups, but we still want -* the group display. Set the artificial group and set the leader's -* forced_leader flag to notify the display code. -*/ -if (group_set && !session->evlist->nr_groups) { -struct perf_evsel *leader =perf_evlist__first (session->evlist); - -perf_evlist__set_leader (session->evlist); - leader->forced_leader = true; - } +setup_forced_leader (&report, session->evlist);if (itrace_synth_opts.last_branch) has_br_stack = true;tools/perf/util/header.c +10
-2@@ -3415,8 +3415,17 @@ int perf_event__synthesize_features(struct perf_tool *tool,return ret; } } + +/* Send HEADER_LAST_FEATURE mark. */ + fe = ff.buf; + fe->feat_id =HEADER_LAST_FEATURE ; + fe->header.type =PERF_RECORD_HEADER_FEATURE ; + fe->header.size =sizeof (*fe); + + ret =process (tool, ff.buf,NULL ,NULL ); +free (ff.buf); -return 0 ; +return ret; } int perf_event__process_feature(struct perf_tool *tool, --2.13.6
tip-bot for Jiri Olsa
merge bot[tip:perf/core] perf report: Support forced leader feature in pipe mode
In reply to Jiri Olsaperf report: Support forced leader feature in pipe mode
Commit-ID: 57b5de463925b9fbd1eff56a38a510495ac9c2c0 Gitweb: https://git.kernel.org/tip/57b5de463925b9fbd1eff56a38a510495ac9c2c0 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 14 Mar 2018 10:22:05 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 16 Mar 2018 13:56:59 -0300
perf report: Support forced leader feature in pipe mode
Stephane reported a problem with forced leader in pipe mode, where report does not force the group output. The reason is that we don't force the leader in pipe mode.
This patch adds HEADER_LAST_FEATURE mark to have a point where we have all events and features received, and force the group if requested.
$ perf record --group -e '{cycles, instructions}' -o - kill | perf report -i - --groupSNIP
# Overhead Command Shared Object Symbol
# ................ ....... ................ .......................
#
28.36% 0.00% kill libc-2.25.so [.] __unregister_atfork
26.32% 0.00% kill libc-2.25.so [.] _dl_addr
26.10% 0.00% kill ld-2.25.so [.] _dl_relocate_object
17.32% 0.00% kill ld-2.25.so [.] __tunables_init
1.70% 0.01% kill [unknown] [k] 0xffffffffafa01a40
0.20% 0.00% kill ld-2.25.so [.] _start
0.00% 48.77% kill ld-2.25.so [.] do_lookup_x
0.00% 42.97% kill libc-2.25.so [.] _IO_getline
0.00% 6.35% kill ld-2.25.so [.] strcmp
0.00% 1.71% kill ld-2.25.so [.] _dl_sysdep_start
0.00% 0.19% kill ld-2.25.so [.] _dl_start--- tools/perf/builtin-report.c | 57 ++++++++++++++++++++++++++++++++++----------- tools/perf/util/header.c | 11 ++++++++- 2 files changed, 53 insertions(+), 15 deletions(-)
tools/perf/builtin-report.c +43 -14
@@ -68,6 +68,7 @@ struct report {bool header;bool header_only;bool nonany_branch_mode; +bool group_set;int max_stack;struct perf_read_values show_threads_values;const char *pretty_printing_style;
@@ -193,6 +194,45 @@ out:return err; } +/* +* Events in data file are not collect in groups, but we still want +* the group display. Set the artificial group and set the leader's +* forced_leader flag to notify the display code. +*/ +static void setup_forced_leader (struct report *report, +struct perf_evlist *evlist) +{ +if (report->group_set && !evlist->nr_groups) { +struct perf_evsel *leader =perf_evlist__first (evlist); + +perf_evlist__set_leader (evlist); + leader->forced_leader = true; + } +} + +static int process_feature_event (struct perf_tool *tool, +union perf_event *event, +struct perf_session *session__maybe_unused ) +{ + struct report *rep = container_of(tool, struct report, tool); + +if (event->feat.feat_id <HEADER_LAST_FEATURE ) +return perf_event__process_feature (tool, event, session); + +if (event->feat.feat_id !=HEADER_LAST_FEATURE ) { +pr_err ("failed: wrong feature ID: %" PRIu64"\n" , + event->feat.feat_id); +return -1 ; + } + +/* +* All features are received, we can force the +* group if needed. +*/ +setup_forced_leader (rep, session->evlist); +return 0 ; +} + static int process_sample_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample,
@@ -940,7 +980,6 @@ int cmd_report(int argc, const char **argv)"perf report [<options>]" ,NULL }; -bool group_set = false;struct report report = { .tool = { .sample = process_sample_event,
@@ -958,7 +997,7 @@ int cmd_report(int argc, const char **argv) .id_index = perf_event__process_id_index, .auxtrace_info = perf_event__process_auxtrace_info, .auxtrace = perf_event__process_auxtrace, - .feature = perf_event__process_feature, + .feature = process_feature_event, .ordered_events = true, .ordering_requires_timestamps = true, },
@@ -1060,7 +1099,7 @@ int cmd_report(int argc, const char **argv) "Specify disassembler style (e.g. -M intel for intel syntax)"),OPT_BOOLEAN (0 ,"show-total-period" , &symbol_conf.show_total_period,"Show a column with the sum of periods" ), -OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &group_set, +OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &report.group_set,"Show event group information together" ), OPT_CALLBACK_NOOPT('b', "branch-stack", &branch_mode, "", "use branch records for per branch histogram filling",
@@ -1177,17 +1216,7 @@ repeat: has_br_stack =perf_header__has_feat (&session->header,HEADER_BRANCH_STACK ); -/* -* Events in data file are not collect in groups, but we still want -* the group display. Set the artificial group and set the leader's -* forced_leader flag to notify the display code. -*/ -if (group_set && !session->evlist->nr_groups) { -struct perf_evsel *leader =perf_evlist__first (session->evlist); - -perf_evlist__set_leader (session->evlist); - leader->forced_leader = true; - } +setup_forced_leader (&report, session->evlist);if (itrace_synth_opts.last_branch) has_br_stack = true;
tools/perf/util/header.c +10 -1
@@ -3415,8 +3415,17 @@ int perf_event__synthesize_features(struct perf_tool *tool,return ret; } } + +/* Send HEADER_LAST_FEATURE mark. */ + fe = ff.buf; + fe->feat_id =HEADER_LAST_FEATURE ; + fe->header.type =PERF_RECORD_HEADER_FEATURE ; + fe->header.size =sizeof (*fe); + + ret =process (tool, ff.buf,NULL ,NULL ); +free (ff.buf); -return 0 ; +return ret; } int perf_event__process_feature(struct perf_tool *tool,
Quoted 5 lines · Jiri Olsa
We need to synthesize events first, because some
features works on top of them (on report side).Signed-off-by Jiri Olsa <[email protected]>
Works for me.
Quoted 43 lines
--- tools/perf/builtin-record.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)tools/perf/builtin-record.c +11
-8@@ -754,13 +754,10 @@ static int record__synthesize(struct record *rec, bool tail)return 0 ;if (data->is_pipe) { - err =perf_event__synthesize_features ( - tool, session, rec->evlist, process_synthesized_event); -if (err <0 ) { -pr_err ("Couldn't synthesize features.\n" ); -return err; - } - +/* +* We need to synthesize events first, because some +* features works on top of them (on report side). +*/ err =perf_event__synthesize_attrs (tool, session, process_synthesized_event);if (err <0 ) {@@ -768,6 +765,13 @@ static int record__synthesize(struct record *rec, bool tail) goto out; } + err =perf_event__synthesize_features (tool, session, rec->evlist, + process_synthesized_event); +if (err <0 ) { +pr_err ("Couldn't synthesize features.\n" ); +return err; + } +if (have_tracepoints (&rec->evlist->entries)) {/* * FIXME err <= 0 here actually means that -- 2.13.6
Arnaldo Carvalho de Melo
maintainerEm Wed, Mar 14, 2018 at 11:45:14AM -0700, Stephane Eranian escreveu:
Quoted 9 lines · Jiri Olsa
Quoted 5 lines
We need to synthesize events first, because some
features works on top of them (on report side).Signed-off-by Jiri Olsa <[email protected]>Works for me.
Tested-by Stephane Eranian <[email protected]>
Thanks for testing, will apply.
- Arnaldo
tip-bot for Jiri Olsa
merge botperf record: Synthesize features before events in pipe mode
Commit-ID: a2015516c5c0be932a69e1d3405c2fb03b4eacf1 Gitweb: https://git.kernel.org/tip/a2015516c5c0be932a69e1d3405c2fb03b4eacf1 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 14 Mar 2018 10:22:04 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 16 Mar 2018 13:56:50 -0300
perf record: Synthesize features before events in pipe mode
We need to synthesize events first, because some features works on top of them (on report side).
--- tools/perf/builtin-record.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
tools/perf/builtin-record.c +11 -7
@@ -754,13 +754,10 @@ static int record__synthesize(struct record *rec, bool tail)return 0 ;if (data->is_pipe) { - err =perf_event__synthesize_features ( - tool, session, rec->evlist, process_synthesized_event); -if (err <0 ) { -pr_err ("Couldn't synthesize features.\n" ); -return err; - } - +/* +* We need to synthesize events first, because some +* features works on top of them (on report side). +*/ err =perf_event__synthesize_attrs (tool, session, process_synthesized_event);if (err <0 ) {
@@ -768,6 +765,13 @@ static int record__synthesize(struct record *rec, bool tail) goto out; } + err =perf_event__synthesize_features (tool, session, rec->evlist, + process_synthesized_event); +if (err <0 ) { +pr_err ("Couldn't synthesize features.\n" ); +return err; + } +if (have_tracepoints (&rec->evlist->entries)) {/* * FIXME err <= 0 here actually means that