public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Thomas Richter <tmricht@linux.vnet.ibm.com>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 38/41] perf cpuid: Introduce a platform specific cpuid compare function
Date: Fri, 16 Feb 2018 16:17:43 -0300	[thread overview]
Message-ID: <20180216191746.11095-39-acme@kernel.org> (raw)
In-Reply-To: <20180216191746.11095-1-acme@kernel.org>

From: Thomas Richter <tmricht@linux.vnet.ibm.com>

The function get_cpuid_str() is called by perf_pmu__getcpuid() and on
s390 returns a complete description of the CPU and its capabilities,
which is a comma separated list.

To map the CPU type with the value defined in the
pmu-events/arch/s390/mapfile.csv, introduce an architecture specific
cpuid compare function named strcmp_cpuid_str()

The currently used regex algorithm is defined as the weak default and
will be used if no platform specific one is defined. This matches the
current behavior.

Signed-off-by: Thomas Richter <tmricht@linux.vnet.ibm.com>
Reviewed-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Link: http://lkml.kernel.org/r/20180213151419.80737-3-tmricht@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/arch/s390/util/header.c | 18 +++++++++++++++
 tools/perf/util/header.h           |  1 +
 tools/perf/util/pmu.c              | 47 +++++++++++++++++++++++---------------
 3 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/tools/perf/arch/s390/util/header.c b/tools/perf/arch/s390/util/header.c
index a78064c25ced..231294b80dc4 100644
--- a/tools/perf/arch/s390/util/header.c
+++ b/tools/perf/arch/s390/util/header.c
@@ -146,3 +146,21 @@ char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused)
 		zfree(&buf);
 	return buf;
 }
+
+/*
+ * Compare the cpuid string returned by get_cpuid() function
+ * with the name generated by the jevents file read from
+ * pmu-events/arch/s390/mapfile.csv.
+ *
+ * Parameter mapcpuid is the cpuid as stored in the
+ * pmu-events/arch/s390/mapfile.csv. This is just the type number.
+ * Parameter cpuid is the cpuid returned by function get_cpuid().
+ */
+int strcmp_cpuid_str(const char *mapcpuid, const char *cpuid)
+{
+	char *cp = strchr(cpuid, ',');
+
+	if (cp == NULL)
+		return -1;
+	return strncmp(cp + 1, mapcpuid, strlen(mapcpuid));
+}
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index f28aaaa3a440..942bdec6d70d 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -174,4 +174,5 @@ int write_padded(struct feat_fd *fd, const void *bf,
 int get_cpuid(char *buffer, size_t sz);
 
 char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused);
+int strcmp_cpuid_str(const char *s1, const char *s2);
 #endif /* __PERF_HEADER_H */
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 57e38fdf0b34..1111d5bf15ca 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -576,6 +576,34 @@ char * __weak get_cpuid_str(struct perf_pmu *pmu __maybe_unused)
 	return NULL;
 }
 
+/* Return zero when the cpuid from the mapfile.csv matches the
+ * cpuid string generated on this platform.
+ * Otherwise return non-zero.
+ */
+int __weak strcmp_cpuid_str(const char *mapcpuid, const char *cpuid)
+{
+	regex_t re;
+	regmatch_t pmatch[1];
+	int match;
+
+	if (regcomp(&re, mapcpuid, REG_EXTENDED) != 0) {
+		/* Warn unable to generate match particular string. */
+		pr_info("Invalid regular expression %s\n", mapcpuid);
+		return 1;
+	}
+
+	match = !regexec(&re, cpuid, 1, pmatch, 0);
+	regfree(&re);
+	if (match) {
+		size_t match_len = (pmatch[0].rm_eo - pmatch[0].rm_so);
+
+		/* Verify the entire string matched. */
+		if (match_len == strlen(cpuid))
+			return 0;
+	}
+	return 1;
+}
+
 static char *perf_pmu__getcpuid(struct perf_pmu *pmu)
 {
 	char *cpuid;
@@ -610,31 +638,14 @@ struct pmu_events_map *perf_pmu__find_map(struct perf_pmu *pmu)
 
 	i = 0;
 	for (;;) {
-		regex_t re;
-		regmatch_t pmatch[1];
-		int match;
-
 		map = &pmu_events_map[i++];
 		if (!map->table) {
 			map = NULL;
 			break;
 		}
 
-		if (regcomp(&re, map->cpuid, REG_EXTENDED) != 0) {
-			/* Warn unable to generate match particular string. */
-			pr_info("Invalid regular expression %s\n", map->cpuid);
+		if (!strcmp_cpuid_str(map->cpuid, cpuid))
 			break;
-		}
-
-		match = !regexec(&re, cpuid, 1, pmatch, 0);
-		regfree(&re);
-		if (match) {
-			size_t match_len = (pmatch[0].rm_eo - pmatch[0].rm_so);
-
-			/* Verify the entire string matched. */
-			if (match_len == strlen(cpuid))
-				break;
-		}
 	}
 	free(cpuid);
 	return map;
-- 
2.14.3

  parent reply	other threads:[~2018-02-16 19:22 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-16 19:17 [GIT PULL 00/41] perf/core improvements and fixes Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 01/41] perf record: Put new line after target override warning Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 02/41] perf script: Add --show-round-event to display PERF_RECORD_FINISHED_ROUND Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 03/41] tools lib api fs: Add filename__read_xll function Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 04/41] tools lib api fs: Add sysfs__read_xll function Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 05/41] perf tests: Fix dwarf unwind for stripped binaries Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 06/41] perf tools: Fix comment for sort__* compare functions Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 07/41] perf report: Ask for ordered events for --tasks option Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 08/41] perf report: Add support to display group output for non group events Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 09/41] perf stat: Add support to print counts for fixed times Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 10/41] perf stat: Add support to print counts after a period of time Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 11/41] tools lib symbol: Skip non-address kallsyms line Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 12/41] perf symbols: Check if we read regular file in dso__load() Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 13/41] perf machine: Free root_dir in machine__init() error path Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 14/41] perf machine: Move kernel mmap name into struct machine Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 15/41] perf machine: Generalize machine__set_kernel_mmap() Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 16/41] perf machine: Don't search for active kernel start in __machine__create_kernel_maps Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 17/41] perf machine: Remove machine__load_kallsyms() Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 18/41] perf tools: Do not create kernel maps in sample__resolve() Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 19/41] perf tests: Use arch__compare_symbol_names to compare symbols Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 20/41] perf cs-etm: Freeing allocated memory Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 21/41] perf tools: Use target->per_thread and target->system_wide flags Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 22/41] perf auxtrace arm: Fixing uninitialised variable Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 23/41] perf cs-etm: Properly deal with cpu maps Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 24/41] perf annotate: Add missing arguments in Man page Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 25/41] perf kmem: Document a missing option & an argument Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 26/41] perf mem: Document a missing option Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 27/41] perf cs-etm: Inject capabilitity for CoreSight traces Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 28/41] perf inject: Emit instruction records on ETM trace discontinuity Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 29/41] coresight: Update documentation for perf usage Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 30/41] perf report: Fix description for --mem-mode Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 31/41] perf report: Fix wrong jump arrow Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 32/41] perf report: Fix memory corruption in --branch-history mode --branch-history Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 33/41] tools include powerpc: Grab a copy of arch/powerpc/include/uapi/asm/unistd.h Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 34/41] perf powerpc: Generate system call table from asm/unistd.h Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 35/41] perf trace powerpc: Use generated syscall table Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 36/41] perf record: Provide detailed information on s390 CPU Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 37/41] perf annotate: Scan cpuid for s390 and save machine type Arnaldo Carvalho de Melo
2018-02-16 19:17 ` Arnaldo Carvalho de Melo [this message]
2018-02-16 19:17 ` [PATCH 39/41] perf test: Fix test case 23 for s390 z/VM or KVM guests Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 40/41] perf test: Fix test case inet_pton to accept inlines Arnaldo Carvalho de Melo
2018-02-16 19:17 ` [PATCH 41/41] perf tests shell lib: Use a wildcard to remove the vfs_getname probe Arnaldo Carvalho de Melo
2018-02-17 10:49 ` [GIT PULL 00/41] perf/core improvements and fixes Ingo Molnar

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=20180216191746.11095-39-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=tmricht@linux.vnet.ibm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox