From: kan.liang@linux.intel.com
To: acme@kernel.org, mingo@redhat.com, peterz@infradead.org,
irogers@google.com, namhyung@kernel.org, jolsa@kernel.org,
adrian.hunter@intel.com, linux-perf-users@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: ak@linux.intel.com, eranian@google.com, ahmad.yasin@intel.com,
Kan Liang <kan.liang@linux.intel.com>
Subject: [PATCH V4 1/5] perf metrics: Sort the Default metricgroup
Date: Thu, 15 Jun 2023 20:14:16 -0700 [thread overview]
Message-ID: <20230616031420.3751973-2-kan.liang@linux.intel.com> (raw)
In-Reply-To: <20230616031420.3751973-1-kan.liang@linux.intel.com>
From: Kan Liang <kan.liang@linux.intel.com>
The new default mode will print the metrics as a metric group. The
metrics from the same metric group must be adjacent to each other in the
metric list. But the metric_list_cmp() sorts metrics by the number of
events.
Add a new sort for the Default metricgroup, which sorts by
default_metricgroup_name and metric_name.
Add is_default in the struct metric_event to indicate that it's from
the Default metricgroup.
Store the displayed metricgroup name of the Default metricgroup into
the metric expr for output.
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
---
tools/perf/util/metricgroup.c | 26 ++++++++++++++++++++++++++
tools/perf/util/metricgroup.h | 3 +++
2 files changed, 29 insertions(+)
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index 8b19644ade7d..a6a5ed44a679 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -79,6 +79,7 @@ static struct rb_node *metric_event_new(struct rblist *rblist __maybe_unused,
return NULL;
memcpy(me, entry, sizeof(struct metric_event));
me->evsel = ((struct metric_event *)entry)->evsel;
+ me->is_default = false;
INIT_LIST_HEAD(&me->head);
return &me->nd;
}
@@ -1160,6 +1161,25 @@ static int metric_list_cmp(void *priv __maybe_unused, const struct list_head *l,
return right_count - left_count;
}
+/**
+ * default_metricgroup_cmp - Implements complex key for the Default metricgroup
+ * that first sorts by default_metricgroup_name, then
+ * metric_name.
+ */
+static int default_metricgroup_cmp(void *priv __maybe_unused,
+ const struct list_head *l,
+ const struct list_head *r)
+{
+ const struct metric *left = container_of(l, struct metric, nd);
+ const struct metric *right = container_of(r, struct metric, nd);
+ int diff = strcmp(right->default_metricgroup_name, left->default_metricgroup_name);
+
+ if (diff)
+ return diff;
+
+ return strcmp(right->metric_name, left->metric_name);
+}
+
struct metricgroup__add_metric_data {
struct list_head *list;
const char *pmu;
@@ -1515,6 +1535,7 @@ static int parse_groups(struct evlist *perf_evlist,
LIST_HEAD(metric_list);
struct metric *m;
bool tool_events[PERF_TOOL_MAX] = {false};
+ bool is_default = !strcmp(str, "Default");
int ret;
if (metric_events_list->nr_entries == 0)
@@ -1549,6 +1570,9 @@ static int parse_groups(struct evlist *perf_evlist,
goto out;
}
+ if (is_default)
+ list_sort(NULL, &metric_list, default_metricgroup_cmp);
+
list_for_each_entry(m, &metric_list, nd) {
struct metric_event *me;
struct evsel **metric_events;
@@ -1637,6 +1661,8 @@ static int parse_groups(struct evlist *perf_evlist,
expr->metric_unit = m->metric_unit;
expr->metric_events = metric_events;
expr->runtime = m->pctx->sctx.runtime;
+ expr->default_metricgroup_name = m->default_metricgroup_name;
+ me->is_default = is_default;
list_add(&expr->nd, &me->head);
}
diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
index bf18274c15df..d5325c6ec8e1 100644
--- a/tools/perf/util/metricgroup.h
+++ b/tools/perf/util/metricgroup.h
@@ -22,6 +22,7 @@ struct cgroup;
struct metric_event {
struct rb_node nd;
struct evsel *evsel;
+ bool is_default; /* the metric evsel from the Default metricgroup */
struct list_head head; /* list of metric_expr */
};
@@ -55,6 +56,8 @@ struct metric_expr {
* more human intelligible) and then add "MiB" afterward when displayed.
*/
const char *metric_unit;
+ /** Displayed metricgroup name of the Default metricgroup */
+ const char *default_metricgroup_name;
/** Null terminated array of events used by the metric. */
struct evsel **metric_events;
/** Null terminated array of referenced metrics. */
--
2.35.1
next prev parent reply other threads:[~2023-06-16 3:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-16 3:14 [PATCH V4 0/5] New metricgroup output in perf stat default mode kan.liang
2023-06-16 3:14 ` kan.liang [this message]
2023-06-16 5:48 ` [PATCH V4 1/5] perf metrics: Sort the Default metricgroup Ian Rogers
2023-06-16 3:14 ` [PATCH V4 2/5] perf stat: New metricgroup output for the default mode kan.liang
2023-06-16 5:56 ` Ian Rogers
2023-06-16 13:23 ` Liang, Kan
2023-06-16 3:14 ` [PATCH V4 3/5] perf test: Move all the check functions of stat csv output to lib kan.liang
2023-06-16 3:14 ` [PATCH V4 4/5] perf test: Add test case for the standard perf stat output kan.liang
2023-06-16 3:14 ` [PATCH V4 5/5] perf vendor events arm64: Add default tags for Hisi hip08 L1 metrics kan.liang
2023-06-16 5:57 ` Ian Rogers
2023-06-16 13:48 ` John Garry
2023-06-16 5:59 ` [PATCH V4 0/5] New metricgroup output in perf stat default mode Ian Rogers
2023-06-16 13:26 ` Liang, Kan
2023-06-16 13:39 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230616031420.3751973-2-kan.liang@linux.intel.com \
--to=kan.liang@linux.intel.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ahmad.yasin@intel.com \
--cc=ak@linux.intel.com \
--cc=eranian@google.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.