From nobody Fri Dec 19 19:56:48 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4E8F31CEEBB; Mon, 31 Mar 2025 07:37:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406644; cv=none; b=fAntnJVdmPN7quTWUoseXt+Wlq7gj0wScewB7dD+6Ah+Y8aNG1oj/7oJOZkwBT89ALaN/dcfzfaplTjsBOlGzjL5y0EC4gybCLLx36MXBChM5vTWVsg71R0xdBJv8r8B6VXbCvYNAQ26qtKnZXnBIzLW5vOtk6LpivqIQXbLEnQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406644; c=relaxed/simple; bh=dhoWW6Oi8jAkJCdBJoRBk9QhR4hqUR8fxe78GTR9gmM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kFc46yBF9wKaUQ8OiKV/GheLIACm0rJO+f7/3FkRGtseTDoejSclUBzAShCnSJ3pi1d09F3oDJ4MrBW9N5gJbP9UjX8/BKlV8eO5UT3FJNcu0RTQDGYnuYetJHSk/Zx7g6jDbrTudMzNssJoHszJjBtZqUGi9Eu+fIfeylH2lY4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WNF+UtIz; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="WNF+UtIz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 63252C4CEED; Mon, 31 Mar 2025 07:37:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743406643; bh=dhoWW6Oi8jAkJCdBJoRBk9QhR4hqUR8fxe78GTR9gmM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WNF+UtIz35c6PH6V29HR1kZWttLq9qbLb7UBQE4FtJhHMOIHRKfg7+uzi7aTsEobv fyKyxXT1cC1FIgvjqr/SkjgOOu3p1xI6JO/0/nYbdjrbREq67lSBboXq1B2jswNqg5 nIItTO/B+Ud6hG1OeCEgA05IxL6cyBqdTlXgNdQG1UkOwGI4o6LQCCc5ZivZGlLxBo 2HQoELXXKDkp2nQPlvwLIKDA3pfMVO2GpGgQr5G2TqDWK+2KnDe9BkwcUe4bLqmyQ1 gHwB7ffNByuJO82kjFOSajR1X5owh3JMj3veA8MVFgnBEOq6/tFZSDUikBOtEfGcAS DyUdC0CWXr8wg== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 1/4] perf hist: Remove formats in hierarchy when cancel children Date: Mon, 31 Mar 2025 00:37:19 -0700 Message-ID: <20250331073722.4695-2-namhyung@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250331073722.4695-1-namhyung@kernel.org> References: <20250331073722.4695-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is to support hierarchy options with custom output fields. Currently perf_hpp__cancel_cumulate() only removes accumulated overhead and latency fields from the global perf_hpp_list. This is not used in the hierarchy mode because each evsel's hist has its own separate hpp_list. So it needs to remove the fields from the lists too. Pass evlist to the function so that it can iterate the evsels. Signed-off-by: Namhyung Kim --- tools/perf/builtin-report.c | 2 +- tools/perf/builtin-top.c | 2 +- tools/perf/ui/hist.c | 20 +++++++++++++++++++- tools/perf/util/hist.h | 2 +- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index b030ce72e13ea8d1..c9138e1379808097 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -413,7 +413,7 @@ static int report__setup_sample_type(struct report *rep) /* Silently ignore if callchain is missing */ if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) { symbol_conf.cumulate_callchain =3D false; - perf_hpp__cancel_cumulate(); + perf_hpp__cancel_cumulate(session->evlist); } } =20 diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 1061f4eebc3f6414..f9f31391bddba074 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c @@ -1790,7 +1790,7 @@ int cmd_top(int argc, const char **argv) =20 if (!callchain_param.enabled) { symbol_conf.cumulate_callchain =3D false; - perf_hpp__cancel_cumulate(); + perf_hpp__cancel_cumulate(top.evlist); } =20 if (symbol_conf.cumulate_callchain && !callchain_param.order_set) diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c index ae3b7fe1dadc8f22..1d3f944ed35ed152 100644 --- a/tools/perf/ui/hist.c +++ b/tools/perf/ui/hist.c @@ -699,9 +699,10 @@ static void perf_hpp__column_unregister(struct perf_hp= p_fmt *format) fmt_free(format); } =20 -void perf_hpp__cancel_cumulate(void) +void perf_hpp__cancel_cumulate(struct evlist *evlist) { struct perf_hpp_fmt *fmt, *acc, *ovh, *acc_lat, *tmp; + struct evsel *evsel; =20 if (is_strict_order(field_order)) return; @@ -719,6 +720,23 @@ void perf_hpp__cancel_cumulate(void) if (fmt_equal(ovh, fmt)) fmt->name =3D "Overhead"; } + + evlist__for_each_entry(evlist, evsel) { + struct hists *hists =3D evsel__hists(evsel); + struct perf_hpp_list_node *node; + + list_for_each_entry(node, &hists->hpp_formats, list) { + perf_hpp_list__for_each_format_safe(&node->hpp, fmt, tmp) { + if (fmt_equal(acc, fmt) || fmt_equal(acc_lat, fmt)) { + perf_hpp__column_unregister(fmt); + continue; + } + + if (fmt_equal(ovh, fmt)) + fmt->name =3D "Overhead"; + } + } + } } =20 void perf_hpp__cancel_latency(void) diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index 317d06cca8b88e3e..8cc94928fcb35a5b 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -581,7 +581,7 @@ enum { }; =20 void perf_hpp__init(void); -void perf_hpp__cancel_cumulate(void); +void perf_hpp__cancel_cumulate(struct evlist *evlist); void perf_hpp__cancel_latency(void); void perf_hpp__setup_output_field(struct perf_hpp_list *list); void perf_hpp__reset_output_field(struct perf_hpp_list *list); --=20 2.49.0 From nobody Fri Dec 19 19:56:48 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BF0E1D416E; Mon, 31 Mar 2025 07:37:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406644; cv=none; b=QT4NP5p9S5wd8ywSwLwMKXOqQ960gzHs+iEdtuwKjib4HO9nZ9qtODLXGb86mrBAA4SARHgGNsWvid3WeIZFA0/Hr1H87ogIUCRoERD7HpKPD+C/jWuUqtl2hF4kTRCppWDwL7yS94JXR0SXz1J14ozST2rL1BGYLyr4JexgXWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406644; c=relaxed/simple; bh=Rj073L9NGIPpw7qZbc0krqGkxraO1TRJZLZphGoiFok=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cefvnttEeqIqFtPgvUZu+cTu0KtF9ISMwgzkekUlpmYtTZsTmKvZgbmB1UPaXlYzokJ6yE48K2moHBoaGwX/ZFFHuq0ILMrGSaf0NyWdDSltDnB5GXeFrVVUu8IpITC2u+9WoE/V6v9hRIYL8SOAjuJ5K6Io9gFK2Ub+zaHAwfA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cTOry2U7; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cTOry2U7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0367C4CEE5; Mon, 31 Mar 2025 07:37:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743406644; bh=Rj073L9NGIPpw7qZbc0krqGkxraO1TRJZLZphGoiFok=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cTOry2U7xVtdG+UvKurRJTEBU1X0OA2gBXRAPuYfoQMWcpz529yi3QV1zv9/GB91s e3m5cgarexbJnGmw5+gL+HY5pnlS4qdetEdNANsMByXzxM1opC/7AP8OKw6rlmvS29 VPWmGJA5bovQ2U2UdpMudutJB57yG3NyZ1AjCyvGmhSfm/DESJt3tQvsF9ND7fFMG3 /i/6Ob0XA9V+un5Tm0zZ4jtVT6j5weCpYJFhPVWi2pcZn3xHF9cczAF0jcaAdqbTmc vs+/QWxX/zgLgg2zPabIyDQ/CNFBKqEGYaZd8RkDI3vyBYLXj700N9quIRyptBMjrA 4s1FSktUsNO4g== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 2/4] perf hist: Remove formats in hierarchy when cancel latency Date: Mon, 31 Mar 2025 00:37:20 -0700 Message-ID: <20250331073722.4695-3-namhyung@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250331073722.4695-1-namhyung@kernel.org> References: <20250331073722.4695-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Likewise, it should remove latency output fields in hierarchy list. Pass evlist to perf_hpp__cancel_latency() to handle them properly. Signed-off-by: Namhyung Kim --- tools/perf/builtin-report.c | 2 +- tools/perf/ui/hist.c | 15 ++++++++++++++- tools/perf/util/hist.h | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index c9138e1379808097..c207aaed7ae5fc2b 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1088,7 +1088,7 @@ static int __cmd_report(struct report *rep) /* Don't show Latency column for non-parallel profiles by default. */ if (!symbol_conf.prefer_latency && rep->total_samples && rep->singlethreaded_samples * 100 / rep->total_samples >=3D 99) - perf_hpp__cancel_latency(); + perf_hpp__cancel_latency(session->evlist); =20 evlist__check_mem_load_aux(session->evlist); =20 diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c index 1d3f944ed35ed152..3ffce69fc823e0bf 100644 --- a/tools/perf/ui/hist.c +++ b/tools/perf/ui/hist.c @@ -739,9 +739,10 @@ void perf_hpp__cancel_cumulate(struct evlist *evlist) } } =20 -void perf_hpp__cancel_latency(void) +void perf_hpp__cancel_latency(struct evlist *evlist) { struct perf_hpp_fmt *fmt, *lat, *acc, *tmp; + struct evsel *evsel; =20 if (is_strict_order(field_order)) return; @@ -755,6 +756,18 @@ void perf_hpp__cancel_latency(void) if (fmt_equal(lat, fmt) || fmt_equal(acc, fmt)) perf_hpp__column_unregister(fmt); } + + evlist__for_each_entry(evlist, evsel) { + struct hists *hists =3D evsel__hists(evsel); + struct perf_hpp_list_node *node; + + list_for_each_entry(node, &hists->hpp_formats, list) { + perf_hpp_list__for_each_format_safe(&node->hpp, fmt, tmp) { + if (fmt_equal(lat, fmt) || fmt_equal(acc, fmt)) + perf_hpp__column_unregister(fmt); + } + } + } } =20 void perf_hpp__setup_output_field(struct perf_hpp_list *list) diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h index 8cc94928fcb35a5b..76efd8952507a561 100644 --- a/tools/perf/util/hist.h +++ b/tools/perf/util/hist.h @@ -582,7 +582,7 @@ enum { =20 void perf_hpp__init(void); void perf_hpp__cancel_cumulate(struct evlist *evlist); -void perf_hpp__cancel_latency(void); +void perf_hpp__cancel_latency(struct evlist *evlist); void perf_hpp__setup_output_field(struct perf_hpp_list *list); void perf_hpp__reset_output_field(struct perf_hpp_list *list); void perf_hpp__append_sort_keys(struct perf_hpp_list *list); --=20 2.49.0 From nobody Fri Dec 19 19:56:48 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E03301D54D8; Mon, 31 Mar 2025 07:37:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406645; cv=none; b=b9M5HgWXg6IDvUVwHjA3sgJDVvBLHoXVpajQqRIASETZheK2pr7g6FR3mz9mKv1vosY/RmveQBApZoN+lTR7prh6a2DgNo6Tq5UG40XLM/jJfGdmT/GZ+k7cLQBDyzbivkNE8PwzTBwepZbn97BsE12txtnDS3J5fHgfO/NHsco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406645; c=relaxed/simple; bh=+g9pedH9vn7fn6iV8pHdDuF77nHGCBMjaxZvpLdqowI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BtKSJN3lR1dCSW8xjAQ5fwjBjVRiPN14dcQmHQTVz2S84cpXlVswn2UT8jCrLJw3EeuTnRmG/yArDtDzIwwRO05S6yDYPpiK1IjPYS+Mqn6mScMclGoc2dUgsglBC2u1l46/8bcW0pi/MOlkhvqSO7DHi/ZLGHsL376ZL0+L+sI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=QvuvJCCM; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="QvuvJCCM" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 68126C4CEEF; Mon, 31 Mar 2025 07:37:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743406644; bh=+g9pedH9vn7fn6iV8pHdDuF77nHGCBMjaxZvpLdqowI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QvuvJCCM8oYGbTNFptF8rvVEhpVLAPfE9BZK+3b5tQpdXruaWwp1YQQJ0s7JUrNQ6 Ge2upvcdO0dPJ5HnsK7/uiTBqafLw59g/bhFj9oBUQEORbBbMxzxqYWQBdaHHkKess 2fF7Tlq5/U3IGdX6UgHNRijpiOt8X163jBSSOQ+PSQngwOeJ5J5QoNTjvjTLdJcuZo 6ZI5JRk1pA+Ire8IDPs47XRW431h6XcjRoAvfz3v4pJfOslR4oCMXRrFbGd8pwb5Bl PB9+khE7MKkAXzHfw2/LGMlAqTWE2p2TXk98f5XUDqYNzwlaHxUUQTa0ozEesdcDKP FXeJq4tK2PZFQ== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 3/4] perf hist: Set levels in output_field_add() Date: Mon, 31 Mar 2025 00:37:21 -0700 Message-ID: <20250331073722.4695-4-namhyung@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250331073722.4695-1-namhyung@kernel.org> References: <20250331073722.4695-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" It turns out that the output fields didn't consider the hierarchy mode and put all the fields in the same level. To support hierarchy, each non-output field should be in a separate level. Pass a pointer to level to output_field_add() and make it increase the level when it sees non- output fields. Signed-off-by: Namhyung Kim --- tools/perf/builtin-c2c.c | 3 ++- tools/perf/util/sort.c | 36 +++++++++++++++++++++++------------- tools/perf/util/sort.h | 2 +- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index 5d5bb0f32334a975..e2e257bcc461fbdb 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -1969,10 +1969,11 @@ static struct c2c_fmt *get_format(const char *name) static int c2c_hists__init_output(struct perf_hpp_list *hpp_list, char *na= me) { struct c2c_fmt *c2c_fmt =3D get_format(name); + int level =3D 0; =20 if (!c2c_fmt) { reset_dimensions(); - return output_field_add(hpp_list, name); + return output_field_add(hpp_list, name, &level); } =20 perf_hpp_list__column_register(hpp_list, &c2c_fmt->fmt); diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index c51049087e4ebb6c..594b75ca95bf72b2 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -2884,9 +2884,10 @@ static int __sort_dimension__add_hpp_sort(struct sor= t_dimension *sd, } =20 static int __sort_dimension__add_hpp_output(struct sort_dimension *sd, - struct perf_hpp_list *list) + struct perf_hpp_list *list, + int level) { - struct hpp_sort_entry *hse =3D __sort_dimension__alloc_hpp(sd, 0); + struct hpp_sort_entry *hse =3D __sort_dimension__alloc_hpp(sd, level); =20 if (hse =3D=3D NULL) return -1; @@ -3495,12 +3496,13 @@ static int __hpp_dimension__add(struct hpp_dimensio= n *hd, } =20 static int __sort_dimension__add_output(struct perf_hpp_list *list, - struct sort_dimension *sd) + struct sort_dimension *sd, + int level) { if (sd->taken) return 0; =20 - if (__sort_dimension__add_hpp_output(sd, list) < 0) + if (__sort_dimension__add_hpp_output(sd, list, level) < 0) return -1; =20 sd->taken =3D 1; @@ -3508,14 +3510,15 @@ static int __sort_dimension__add_output(struct perf= _hpp_list *list, } =20 static int __hpp_dimension__add_output(struct perf_hpp_list *list, - struct hpp_dimension *hd) + struct hpp_dimension *hd, + int level) { struct perf_hpp_fmt *fmt; =20 if (hd->taken) return 0; =20 - fmt =3D __hpp_dimension__alloc_hpp(hd, 0); + fmt =3D __hpp_dimension__alloc_hpp(hd, level); if (!fmt) return -1; =20 @@ -3532,7 +3535,7 @@ int hpp_dimension__add_output(unsigned col, bool impl= icit) hd =3D &hpp_sort_dimensions[col]; if (implicit && !hd->was_taken) return 0; - return __hpp_dimension__add_output(&perf_hpp_list, hd); + return __hpp_dimension__add_output(&perf_hpp_list, hd, /*level=3D*/0); } =20 int sort_dimension__add(struct perf_hpp_list *list, const char *tok, @@ -4000,7 +4003,7 @@ void sort__setup_elide(FILE *output) } } =20 -int output_field_add(struct perf_hpp_list *list, const char *tok) +int output_field_add(struct perf_hpp_list *list, const char *tok, int *lev= el) { unsigned int i; =20 @@ -4013,16 +4016,22 @@ int output_field_add(struct perf_hpp_list *list, co= nst char *tok) if (!strcasecmp(tok, "weight")) ui__warning("--fields weight shows the average value unlike in the --so= rt key.\n"); =20 - return __hpp_dimension__add_output(list, hd); + return __hpp_dimension__add_output(list, hd, *level); } =20 + /* + * A non-output field will increase level so that it can be in a + * different hierarchy. + */ + (*level)++; + for (i =3D 0; i < ARRAY_SIZE(common_sort_dimensions); i++) { struct sort_dimension *sd =3D &common_sort_dimensions[i]; =20 if (!sd->name || strncasecmp(tok, sd->name, strlen(tok))) continue; =20 - return __sort_dimension__add_output(list, sd); + return __sort_dimension__add_output(list, sd, *level); } =20 for (i =3D 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) { @@ -4034,7 +4043,7 @@ int output_field_add(struct perf_hpp_list *list, cons= t char *tok) if (sort__mode !=3D SORT_MODE__BRANCH) return -EINVAL; =20 - return __sort_dimension__add_output(list, sd); + return __sort_dimension__add_output(list, sd, *level); } =20 for (i =3D 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) { @@ -4046,7 +4055,7 @@ int output_field_add(struct perf_hpp_list *list, cons= t char *tok) if (sort__mode !=3D SORT_MODE__MEMORY) return -EINVAL; =20 - return __sort_dimension__add_output(list, sd); + return __sort_dimension__add_output(list, sd, *level); } =20 return -ESRCH; @@ -4056,10 +4065,11 @@ static int setup_output_list(struct perf_hpp_list *= list, char *str) { char *tmp, *tok; int ret =3D 0; + int level =3D 0; =20 for (tok =3D strtok_r(str, ", ", &tmp); tok; tok =3D strtok_r(NULL, ", ", &tmp)) { - ret =3D output_field_add(list, tok); + ret =3D output_field_add(list, tok, &level); if (ret =3D=3D -EINVAL) { ui__error("Invalid --fields key: `%s'", tok); break; diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index 180d36a2bea355da..6e92ac62b9c80a0b 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h @@ -146,7 +146,7 @@ void reset_dimensions(void); int sort_dimension__add(struct perf_hpp_list *list, const char *tok, struct evlist *evlist, int level); -int output_field_add(struct perf_hpp_list *list, const char *tok); +int output_field_add(struct perf_hpp_list *list, const char *tok, int *lev= el); int64_t sort__iaddr_cmp(struct hist_entry *left, struct hist_entry *right); int64_t --=20 2.49.0 From nobody Fri Dec 19 19:56:48 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BDD401D63F2; Mon, 31 Mar 2025 07:37:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406645; cv=none; b=kb5vav163NsdOPZVHd4QH3JwdGcDJHL+eUGwloZKUkLQIU5HHcRViw0sDIPooVpTv2Lg+iTX0ntdFgnk+PAWNWgHZkIHRikG2oyardNQFY1SbCqL1I/iBTlgmlV9jyVFREfMtJzwFORfvFCK3FhwNdv4tjDTRbZirMTjcwSwJmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743406645; c=relaxed/simple; bh=FGQlRy0zRUTKNA+1bPygSP1h5Y217grg79LHT1F5Luc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aDWlPrGbpMyURv+XM5VfAaR6B7hMpQKjSM2IPiuMjWSFv2XA8/za07LPkiCa53w6JKR60dp0EPjzQGrTi+INUAyPkU9U8TQyo5d1y7RZcAxQrv6Y7sUEnPeTYm7qR247armggWWDspUXIG1RYNLCXDGA68u6omjLoOAxuK4cOfU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=AUBq7jzJ; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="AUBq7jzJ" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7C8FC4CEEA; Mon, 31 Mar 2025 07:37:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743406645; bh=FGQlRy0zRUTKNA+1bPygSP1h5Y217grg79LHT1F5Luc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AUBq7jzJud0p164Rf3NDPYx0HUcd+5PubfSmpo6NNeC53L36F140K94kVj7VO6w23 34CldD5bhAgotpakGhErRZ7zK9wxk0mTsAywFKQV+OUCLthDvHwY3U4VUjd3axvTLE YIadcjwcWotY4/dRvaCApl6CSH4xS5HdXq22TijOyR14xi4iapsx36F3+w40nUJrHV Fmwuhs0WLGZFYhBnRO38DJ/1i5cbbwzgXGwfMKuiciIbYFxhkcmDb1pHdPfkADGR9o nenDDRFR3B1tOIDVvIxTcU5Q4vcR3Htj2xp79Xp+7j6h4agHLyskbv4zviAbQnAG0H OxoTi84cXi9KA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org Subject: [PATCH 4/4] perf hist: Allow custom output fields in hierarchy mode Date: Mon, 31 Mar 2025 00:37:22 -0700 Message-ID: <20250331073722.4695-5-namhyung@kernel.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250331073722.4695-1-namhyung@kernel.org> References: <20250331073722.4695-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now it can handle multiple output fields and sort keys in separate levels, so it should be ok to use it in the hierarchy mode. This allows fully customized output format. $ perf report -F latency,comm,parallelism -H --stdio ... # Latency Command / Parallelism # ........... ..................... # 31.84% cc1 29.96% 5 1.24% 4 0.37% 6 0.26% 3 0.02% 2 24.68% as 22.39% 5 1.12% 2 0.98% 4 0.12% 3 0.07% 6 ... Signed-off-by: Namhyung Kim --- tools/perf/builtin-report.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index c207aaed7ae5fc2b..f0299c7ee0254a37 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1672,14 +1672,10 @@ int cmd_report(int argc, const char **argv) } =20 if (symbol_conf.report_hierarchy) { - /* disable incompatible options */ - if (field_order) { - pr_err("Error: --hierarchy and --fields options cannot be used together= \n"); - parse_options_usage(report_usage, options, "F", 1); - parse_options_usage(NULL, options, "hierarchy", 0); - goto error; - } - + /* + * The hist entries in hierarchy are added during the collpase + * phase. Let's enable it even if no sort keys require it. + */ perf_hpp_list.need_collapse =3D true; } =20 --=20 2.49.0