Received: by 10.213.65.68 with SMTP id h4csp865633imn; Wed, 14 Mar 2018 02:26:29 -0700 (PDT) X-Google-Smtp-Source: AG47ELskMhQSUg0ahQRYSt3/0G6q6KXSGuDstQcTNdgOyEW0GFi1wAv2IY6E1VaUDaZUuz2nsLpy X-Received: by 2002:a17:902:33c2:: with SMTP id b60-v6mr3473660plc.222.1521019589874; Wed, 14 Mar 2018 02:26:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521019589; cv=none; d=google.com; s=arc-20160816; b=F6yq4uGIpHcIIeTmfrcfGnz+CZETapzVhonH5KSJmwAR7UYEnANTur2ohJ1QGwqKMa 8kDfUmMqESWhjw/QW/c9xJty6h1XbNr5HDNAbyg0LXxGTqUUNYuE0MBj/29sYA1Uy4pw wFzIJeHpIchoeCr2nyY72fQlq7lP96sJxbPV4QzCUlJQ2zTmS1ykacgnGdmZHveNVha/ gCcPSyWrYcKH+SdJPcJ8TWTYQ08UTyhml/2PJUevftxrrWOlvEvJo6tQ+68il0fA5IHl GY4bFCVS6uTQi3LRN0UrpXVdC2C0TmoiFOgCjnf5q7bcIgo6m65yQToh8Z+kzp9nOKjL VB0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=bjrTI4tb2/ppbEx56MThIIkMnVuvBzxGLjwT0uOvBl8=; b=derje151/0GMsysWoq0b+TX7hbtpNej8G59jrcrmqiUroIFT1B8R1PJdB8qSKjtcIW jOTXBD3/QWmWJH50dNdBSjG11ch8ENKiQo2X4dmMlNN9GjKax2orK7YO6p/rmT7BbeSZ W+q9YLAPQdUHkGkbOKr01tgqgAR21/LV8zyH7GiBYBRoZ09EkfUGLWAb5TxKagtAlQNl IhrkTGeFFNPhy2O0vhRwmukzoB2K/AMjy4X924LmvUkMBC3e/sUYEIxBDqYMNjvwkhSb Tz32dt/IAnWLZU858oOlMvRD+bNf8S2SMnZw/xP45ZZS1Pmzqn0u041TSbLJt7a9Bluq FdnA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e3si1604855pgv.79.2018.03.14.02.26.15; Wed, 14 Mar 2018 02:26:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751470AbeCNJYs (ORCPT + 99 others); Wed, 14 Mar 2018 05:24:48 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:49554 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751379AbeCNJWJ (ORCPT ); Wed, 14 Mar 2018 05:22:09 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 18B814068031; Wed, 14 Mar 2018 09:22:09 +0000 (UTC) Received: from krava.brq.redhat.com (unknown [10.43.17.142]) by smtp.corp.redhat.com (Postfix) with ESMTP id BDEB063538; Wed, 14 Mar 2018 09:22:07 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: lkml , Ingo Molnar , Namhyung Kim , David Ahern , Alexander Shishkin , Peter Zijlstra , Stephane Eranian Subject: [PATCH 2/2] perf report: Support forced leader feature in pipe mode Date: Wed, 14 Mar 2018 10:22:05 +0100 Message-Id: <20180314092205.23291-2-jolsa@kernel.org> In-Reply-To: <20180314092205.23291-1-jolsa@kernel.org> References: <20180314092205.23291-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Wed, 14 Mar 2018 09:22:09 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Wed, 14 Mar 2018 09:22:09 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'jolsa@kernel.org' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 - --group SNIP # 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 Link: http://lkml.kernel.org/n/tip-afxv5ufoxsbtxfhzupcv9ktg@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/builtin-report.c | 57 ++++++++++++++++++++++++++++++++++----------- tools/perf/util/header.c | 11 ++++++++- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 971ccba85464..91da12975642 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -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 []", 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; diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index e14b3f7c7212..121df1683c36 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -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