From: Jin Yao <yao.jin@linux.intel.com>
To: acme@kernel.org, jolsa@kernel.org, peterz@infradead.org,
mingo@redhat.com, alexander.shishkin@linux.intel.com
Cc: Linux-kernel@vger.kernel.org, ak@linux.intel.com,
kan.liang@intel.com, yao.jin@intel.com,
Jin Yao <yao.jin@linux.intel.com>
Subject: [PATCH v3 06/27] perf pmu: Add hybrid helper functions
Date: Mon, 29 Mar 2021 15:00:25 +0800 [thread overview]
Message-ID: <20210329070046.8815-7-yao.jin@linux.intel.com> (raw)
In-Reply-To: <20210329070046.8815-1-yao.jin@linux.intel.com>
The functions perf_pmu__is_hybrid and perf_pmu__find_hybrid_pmu
can be used to identify the hybrid platform and return the found
hybrid cpu pmu. All the detected hybrid pmus have been saved in
'perf_pmu__hybrid_pmus' list. So we just need to search this list.
perf_pmu__hybrid_type_to_pmu converts the user specified string
to hybrid pmu name. This is used to support the '--cputype' option
in next patches.
perf_pmu__has_hybrid checks the existing of hybrid pmu. Note that,
we have to define it in pmu.c (try to make pmu-hybrid.c no more
symbol dependency), otherwise perf test python would be failed.
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
v3:
- Move perf_pmu__has_hybrid from pmu-hybrid.c to pmu.c. We have to
add pmu-hybrid.c to python-ext-sources to solve symbol dependency
issue found in perf test python. For perf_pmu__has_hybrid, it calls
perf_pmu__scan, which is defined in pmu.c. It's very hard to add
pmu.c to python-ext-sources, too much symbol dependency here.
tools/perf/util/pmu-hybrid.c | 40 ++++++++++++++++++++++++++++++++++++
tools/perf/util/pmu-hybrid.h | 4 ++++
tools/perf/util/pmu.c | 11 ++++++++++
tools/perf/util/pmu.h | 2 ++
4 files changed, 57 insertions(+)
diff --git a/tools/perf/util/pmu-hybrid.c b/tools/perf/util/pmu-hybrid.c
index 7316bf46e54b..86ba84d9469c 100644
--- a/tools/perf/util/pmu-hybrid.c
+++ b/tools/perf/util/pmu-hybrid.c
@@ -33,3 +33,43 @@ bool perf_pmu__hybrid_mounted(const char *name)
snprintf(path, PATH_MAX, CPUS_TEMPLATE_CPU, sysfs, name);
return file_available(path);
}
+
+struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
+{
+ struct perf_pmu *pmu;
+
+ if (!name)
+ return NULL;
+
+ perf_pmu__for_each_hybrid_pmu(pmu) {
+ if (!strcmp(name, pmu->name))
+ return pmu;
+ }
+
+ return NULL;
+}
+
+bool perf_pmu__is_hybrid(const char *name)
+{
+ return perf_pmu__find_hybrid_pmu(name) != NULL;
+}
+
+char *perf_pmu__hybrid_type_to_pmu(const char *type)
+{
+ char *pmu_name = NULL;
+
+ if (asprintf(&pmu_name, "cpu_%s", type) < 0)
+ return NULL;
+
+ if (perf_pmu__is_hybrid(pmu_name))
+ return pmu_name;
+
+ /*
+ * pmu may be not scanned, check the sysfs.
+ */
+ if (perf_pmu__hybrid_mounted(pmu_name))
+ return pmu_name;
+
+ free(pmu_name);
+ return NULL;
+}
diff --git a/tools/perf/util/pmu-hybrid.h b/tools/perf/util/pmu-hybrid.h
index 35bed3714438..d0fa7bc50a76 100644
--- a/tools/perf/util/pmu-hybrid.h
+++ b/tools/perf/util/pmu-hybrid.h
@@ -15,4 +15,8 @@ extern struct list_head perf_pmu__hybrid_pmus;
bool perf_pmu__hybrid_mounted(const char *name);
+struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name);
+bool perf_pmu__is_hybrid(const char *name);
+char *perf_pmu__hybrid_type_to_pmu(const char *type);
+
#endif /* __PMU_HYBRID_H */
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 35e9660c3904..beff29981101 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -40,6 +40,7 @@ int perf_pmu_parse(struct list_head *list, char *name);
extern FILE *perf_pmu_in;
static LIST_HEAD(pmus);
+static bool hybrid_scanned;
/*
* Parse & process all the sysfs attributes located under
@@ -1823,3 +1824,13 @@ int perf_pmu__caps_parse(struct perf_pmu *pmu)
return nr_caps;
}
+
+bool perf_pmu__has_hybrid(void)
+{
+ if (!hybrid_scanned) {
+ hybrid_scanned = true;
+ perf_pmu__scan(NULL);
+ }
+
+ return !list_empty(&perf_pmu__hybrid_pmus);
+}
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 29289e7c2649..5ed2abab7fe0 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -128,4 +128,6 @@ int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
int perf_pmu__caps_parse(struct perf_pmu *pmu);
+bool perf_pmu__has_hybrid(void);
+
#endif /* __PMU_H */
--
2.17.1
next prev parent reply other threads:[~2021-03-29 7:02 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-29 7:00 [PATCH v3 00/27] perf tool: AlderLake hybrid support series 1 Jin Yao
2021-03-29 7:00 ` [PATCH v3 01/27] tools headers uapi: Update tools's copy of linux/perf_event.h Jin Yao
2021-03-29 7:00 ` [PATCH v3 02/27] perf jevents: Support unit value "cpu_core" and "cpu_atom" Jin Yao
2021-03-29 7:00 ` [PATCH v3 03/27] perf pmu: Simplify arguments of __perf_pmu__new_alias Jin Yao
2021-03-29 7:00 ` [PATCH v3 04/27] perf pmu: Save pmu name Jin Yao
2021-03-29 7:00 ` [PATCH v3 05/27] perf pmu: Save detected hybrid pmus to a global pmu list Jin Yao
2021-03-29 7:00 ` Jin Yao [this message]
2021-03-29 7:00 ` [PATCH v3 07/27] perf stat: Uniquify hybrid event name Jin Yao
2021-03-29 7:00 ` [PATCH v3 08/27] perf parse-events: Create two hybrid hardware events Jin Yao
2021-03-29 7:00 ` [PATCH v3 09/27] perf parse-events: Create two hybrid cache events Jin Yao
2021-04-09 13:48 ` Jiri Olsa
2021-04-12 1:15 ` Jin, Yao
2021-03-29 7:00 ` [PATCH v3 10/27] perf parse-events: Create two hybrid raw events Jin Yao
2021-04-09 13:49 ` Jiri Olsa
2021-04-12 1:14 ` Jin, Yao
2021-03-29 7:00 ` [PATCH v3 11/27] perf pmu: Support 'cycles' and 'branches' inside hybrid PMU Jin Yao
2021-04-09 13:48 ` Jiri Olsa
2021-04-12 2:01 ` Jin, Yao
2021-03-29 7:00 ` [PATCH v3 12/27] perf parse-events: Support no alias assigned event " Jin Yao
2021-04-09 13:47 ` Jiri Olsa
2021-04-12 2:51 ` Jin, Yao
2021-04-13 12:36 ` Jiri Olsa
2021-04-15 11:03 ` Jiri Olsa
2021-04-15 13:36 ` Jin, Yao
2021-04-15 14:11 ` Jiri Olsa
2021-04-15 14:53 ` Jin, Yao
2021-04-15 19:39 ` Jiri Olsa
2021-04-16 1:57 ` Jin, Yao
2021-03-29 7:00 ` [PATCH v3 13/27] perf record: Create two hybrid 'cycles' events by default Jin Yao
2021-03-29 7:00 ` [PATCH v3 14/27] perf stat: Add default hybrid events Jin Yao
2021-03-29 7:00 ` [PATCH v3 15/27] perf stat: Filter out unmatched aggregation for hybrid event Jin Yao
2021-03-29 7:00 ` [PATCH v3 16/27] perf stat: Warn group events from different hybrid PMU Jin Yao
2021-03-29 7:00 ` [PATCH v3 17/27] perf script: Support PERF_TYPE_HARDWARE_PMU and PERF_TYPE_HW_CACHE_PMU Jin Yao
2021-03-29 7:00 ` [PATCH v3 18/27] perf record: Uniquify hybrid event name Jin Yao
2021-03-29 7:00 ` [PATCH v3 19/27] perf tests: Add hybrid cases for 'Parse event definition strings' test Jin Yao
2021-03-29 7:00 ` [PATCH v3 20/27] perf tests: Add hybrid cases for 'Roundtrip evsel->name' test Jin Yao
2021-03-29 7:00 ` [PATCH v3 21/27] perf tests: Skip 'Setup struct perf_event_attr' test for hybrid Jin Yao
2021-03-29 7:00 ` [PATCH v3 22/27] perf tests: Support 'Track with sched_switch' " Jin Yao
2021-03-29 7:00 ` [PATCH v3 23/27] perf tests: Support 'Parse and process metrics' " Jin Yao
2021-03-29 7:00 ` [PATCH v3 24/27] perf tests: Support 'Session topology' " Jin Yao
2021-03-29 7:00 ` [PATCH v3 25/27] perf tests: Support 'Convert perf time to TSC' " Jin Yao
2021-03-29 7:00 ` [PATCH v3 26/27] perf tests: Skip 'perf stat metrics (shadow stat) test' " Jin Yao
2021-03-29 7:00 ` [PATCH v3 27/27] perf Documentation: Document intel-hybrid support Jin Yao
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=20210329070046.8815-7-yao.jin@linux.intel.com \
--to=yao.jin@linux.intel.com \
--cc=Linux-kernel@vger.kernel.org \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@intel.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=yao.jin@intel.com \
/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.