Compare commits

...

No commits in common. "c8" and "c8-beta" have entirely different histories.
c8 ... c8-beta

11 changed files with 77 additions and 8540 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/libpfm-4.10.1.tar.gz
SOURCES/libpfm-4.13.0.tar.gz

View File

@ -1 +1 @@
78599e1668142f48c24afb1f79ca00a89df51b65 SOURCES/libpfm-4.10.1.tar.gz
bcb52090f02bc7bcb5ac066494cd55bbd5084e65 SOURCES/libpfm-4.13.0.tar.gz

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +0,0 @@
commit afa8700ce726153fa1547ce118f7f9b029e675c9
Author: Stephane Eranian <eranian@gmail.com>
Date: Wed Jan 16 13:23:11 2019 -0800
clarify description of AMD Fam17h MERGE event
This is a special event used when merging two counters together.
It needs to be programmed on the od-numbered performance counter.
Signed-off-by: Stephane Eranian <eranian@gmail.com>
diff --git a/lib/events/amd64_events_fam17h.h b/lib/events/amd64_events_fam17h.h
index 4f865b9..b0db898 100644
--- a/lib/events/amd64_events_fam17h.h
+++ b/lib/events/amd64_events_fam17h.h
@@ -954,7 +954,7 @@ static const amd64_entry_t amd64_fam17h_pe[]={
.umasks = amd64_fam17h_tablewalker_allocation,
},
{ .name = "MERGE",
- .desc = "See <xref file='svd_core_pmc' title='Large Increment per Cycle Events' format='name'>.",
+ .desc = "Merge two counters together. This event must be programmed on the odd performance counter",
.modmsk = AMD64_FAM17H_ATTRS,
.code = 0xfff,
.flags = 0,
commit ac95d1957771d527f7bf8d11a97fb10ee223d6c0
Author: Stephane Eranian <eranian@gmail.com>
Date: Thu Mar 14 15:19:13 2019 -0700
remove MERGE event from AMD Fam17h table
The MERGE event is not measuring an actual micro-architectural event. Instead
it is used to fuse two consecutive counters together to get a wider counter.
This should be used cautiously and is not currently compatible with Linux
perf_events interface and implementation.
Signed-off-by: Stephane Eranian <eranian@gmail.com>
diff --git a/lib/events/amd64_events_fam17h.h b/lib/events/amd64_events_fam17h.h
index b0db898..deadbed 100644
--- a/lib/events/amd64_events_fam17h.h
+++ b/lib/events/amd64_events_fam17h.h
@@ -953,13 +953,6 @@ static const amd64_entry_t amd64_fam17h_pe[]={
.numasks = LIBPFM_ARRAY_SIZE(amd64_fam17h_tablewalker_allocation),
.umasks = amd64_fam17h_tablewalker_allocation,
},
- { .name = "MERGE",
- .desc = "Merge two counters together. This event must be programmed on the odd performance counter",
- .modmsk = AMD64_FAM17H_ATTRS,
- .code = 0xfff,
- .flags = 0,
- .ngrp = 0,
- },
{ .name = "L1_BTB_CORRECTION",
.desc = "TBD",
.modmsk = AMD64_FAM17H_ATTRS,

View File

@ -1,184 +0,0 @@
commit 20bd642e0ebc2c1d29e39417ee4665271df43d93
Author: Stephane Eranian <eranian@gmail.com>
Date: Thu Nov 7 10:47:02 2019 -0800
add support for speculation event information
This patch extends the information returned by get_event_info()
with speculation information. Some events can include occurrences
happening during speculative execution. This is important information
because it impacts the cost associated with such event. The
pfm_event_info_t struct is extended with a 2-bit field describing
whether or not the event counts during speculation.
Given that the speculation information is not always available from
hardware vendors, the field can have 3 values:
- PFM_EVENT_SPEC_INFO_NA: no information available (default)
- PFM_EVENT_INFO_SPEC_TRUE: event includes speculative execution
- PFM_EVENT_INFO_SPEC_FALSE: evnet does not include speculative execution
Signed-off-by: Stephane Eranian <eranian@gmail.com>
diff --git a/docs/man3/pfm_get_event_info.3 b/docs/man3/pfm_get_event_info.3
index 7eaa6cf..a8c7546 100644
--- a/docs/man3/pfm_get_event_info.3
+++ b/docs/man3/pfm_get_event_info.3
@@ -85,6 +85,16 @@ field means that at least one umask supports precise sampling. On Intel X86
processors, this indicates whether the event supports Precise Event-Based
Sampling (PEBS).
.PP
+.TP
+.B is_speculative
+This bitfield indicates whether or not the event includes occurrences happening
+during speculative execution for both wrong and correct path. Given that this
+kind of event information is not always available from vendors, this field uses
+multiple bits. A value of \fBPFM_EVENT_INFO_SPEC_NA\fR indicates that speculation
+information is not available. A value of \fBPFM_EVENT_INFO_SPEC_TRUE\fR indicates
+that the event count during speculative execution. A value of \fBPFM_EVENT_INFO_SPEC_FALS\fR
+indicates that the event does not count during speculative execution.
+.PP
The \fBpfm_os_t\fR enumeration provides the following choices:
.TP
diff --git a/examples/showevtinfo.c b/examples/showevtinfo.c
index 40966ac..44e958e 100644
--- a/examples/showevtinfo.c
+++ b/examples/showevtinfo.c
@@ -376,11 +376,16 @@ static void
print_event_flags(pfm_event_info_t *info)
{
int n = 0;
+ int spec = info->is_speculative;
if (info->is_precise) {
printf("[precise] ");
n++;
}
+ if (spec > PFM_EVENT_INFO_SPEC_NA) {
+ printf("[%s] ", spec == PFM_EVENT_INFO_SPEC_TRUE ? "speculative" : "non-speculative");
+ n++;
+ }
if (!n)
printf("None");
}
diff --git a/include/perfmon/pfmlib.h b/include/perfmon/pfmlib.h
index bd6f935..09c673d 100644
--- a/include/perfmon/pfmlib.h
+++ b/include/perfmon/pfmlib.h
@@ -645,6 +645,12 @@ typedef struct {
} SWIG_NAME(flags);
} pfm_pmu_info_t;
+typedef enum {
+ PFM_EVENT_INFO_SPEC_NA = 0,
+ PFM_EVENT_INFO_SPEC_TRUE = 1,
+ PFM_EVENT_INFO_SPEC_FALSE = 2,
+} pfm_event_info_spec_t;
+
typedef struct {
const char *name; /* event name */
const char *desc; /* event description */
@@ -657,8 +663,9 @@ typedef struct {
int nattrs; /* number of attributes */
int reserved; /* for future use */
struct {
- unsigned int is_precise:1; /* precise sampling (Intel X86=PEBS) */
- unsigned int reserved_bits:31;
+ unsigned int is_precise:1; /* precise sampling (Intel X86=PEBS) */
+ unsigned int is_speculative:2;/* count correct and wrong path occurrences */
+ unsigned int reserved_bits:29;
} SWIG_NAME(flags);
} pfm_event_info_t;
diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c
index 688edb6..2b6cbb4 100644
--- a/lib/pfmlib_common.c
+++ b/lib/pfmlib_common.c
@@ -1951,7 +1951,8 @@ pfm_get_event_info(int idx, pfm_os_t os, pfm_event_info_t *uinfo)
info.dtype = PFM_DTYPE_UINT64;
/* reset flags */
- info.is_precise = 0;
+ info.is_precise = 0;
+ info.is_speculative = PFM_EVENT_INFO_SPEC_NA;
ret = pmu->get_event_info(pmu, pidx, &info);
if (ret != PFM_SUCCESS)
diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h
index fe13351..b0070a6 100644
--- a/lib/pfmlib_priv.h
+++ b/lib/pfmlib_priv.h
@@ -186,6 +186,7 @@ typedef struct {
#define PFMLIB_PMU_FL_RAW_UMASK 0x4 /* PMU supports PFM_ATTR_RAW_UMASKS */
#define PFMLIB_PMU_FL_ARCH_DFL 0x8 /* PMU is arch default */
#define PFMLIB_PMU_FL_NO_SMPL 0x10 /* PMU does not support sampling */
+#define PFMLIB_PMU_FL_SPEC 0x20 /* PMU provides event speculation info */
typedef struct {
int initdone;
commit fb31170eab2d62d6cb182f14df3a6d8e065303d2
Author: Stephane Eranian <eranian@google.com>
Date: Thu Dec 19 16:13:16 2019 -0800
add PFMLIB_PMU_FL_DEPR flag
To mark a PMU model as deprecated. This is useful when a PMU model
is superseded by another one, yet the obsolete model must remain
for backward compatibility reason.
The ensures that a fully qualified event string with the old pmu
name will still be accepted. But when running on the matching
CPU model, the new PMU model will be selected by default when
the pmu model name is not specified.
Example: when running on pmu_old PMU model:
- pmu_old::cycles is still accepted
- pmu_new::cycles is accepted
- cycles is mapped to pmu_new::cycles
Signed-off-by: Stephane Eranian <eranian@gmail.com>
diff --git a/lib/pfmlib_common.c b/lib/pfmlib_common.c
index 8cb8998..31d16e9 100644
--- a/lib/pfmlib_common.c
+++ b/lib/pfmlib_common.c
@@ -712,6 +712,12 @@ pfmlib_pmu_active(pfmlib_pmu_t *pmu)
return !!(pmu->flags & PFMLIB_PMU_FL_ACTIVE);
}
+static inline int
+pfmlib_pmu_deprecated(pfmlib_pmu_t *pmu)
+{
+ return !!(pmu->flags & PFMLIB_PMU_FL_DEPR);
+}
+
static inline int
pfmlib_pmu_initialized(pfmlib_pmu_t *pmu)
{
@@ -1495,6 +1501,14 @@ pfmlib_parse_event(const char *event, pfmlib_event_desc_t *d)
*/
if (!pname && !pfmlib_pmu_active(pmu))
continue;
+
+ /*
+ * if the PMU name is not passed, then if
+ * the pmu is deprecated, then skip it. It means
+ * there is a better candidate in the active list
+ */
+ if (!pname && pfmlib_pmu_deprecated(pmu))
+ continue;
/*
* check for requested PMU name,
*/
diff --git a/lib/pfmlib_priv.h b/lib/pfmlib_priv.h
index 1340a6b..5cddc9c 100644
--- a/lib/pfmlib_priv.h
+++ b/lib/pfmlib_priv.h
@@ -187,6 +187,7 @@ typedef struct {
#define PFMLIB_PMU_FL_ARCH_DFL 0x8 /* PMU is arch default */
#define PFMLIB_PMU_FL_NO_SMPL 0x10 /* PMU does not support sampling */
#define PFMLIB_PMU_FL_SPEC 0x20 /* PMU provides event speculation info */
+#define PFMLIB_PMU_FL_DEPR 0x40 /* PMU model is deprecated */
typedef struct {
int initdone;

View File

@ -0,0 +1,31 @@
commit 874feacbbe97fe567d3d8b1582d881d1b424dd5e
Author: William Cohen <wcohen@redhat.com>
Date: Fri Apr 14 16:07:07 2023 -0400
Make sure that p is set to a known value before using.
Need to ensure that p was initialized at the start of function
gen_tracepoint_table otherwise on some architectures such as s390x
will get the following error when compiling with -Werror:
make[1]: Entering directory '/root/rpmbuild/BUILD/libpfm-4.13.0/lib'
cc -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=z14 -mtune=z15 -fasynchronous-unwind-tables -fstack-clash-protection -g -Wall -Werror -Wextra -Wno-unused-parameter -I. -I/root/rpmbuild/BUILD/libpfm-4.13.0/lib/../include -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -D_REENTRANT -I. -fvisibility=hidden -DCONFIG_PFMLIB_ARCH_S390X -I. -c pfmlib_perf_event_pmu.c
pfmlib_perf_event_pmu.c: In function 'gen_tracepoint_table':
pfmlib_perf_event_pmu.c:434:35: error: 'p' may be used uninitialized in this function [-Werror=maybe-uninitialized]
434 | p->modmsk = 0;
| ~~~~~~~~~~^~~
cc1: all warnings being treated as errors
diff --git a/lib/pfmlib_perf_event_pmu.c b/lib/pfmlib_perf_event_pmu.c
index 637c5b1..8f7d7d1 100644
--- a/lib/pfmlib_perf_event_pmu.c
+++ b/lib/pfmlib_perf_event_pmu.c
@@ -361,7 +361,7 @@ gen_tracepoint_table(void)
{
DIR *dir1, *dir2;
struct dirent *d1, *d2;
- perf_event_t *p;
+ perf_event_t *p = NULL;
perf_umask_t *um;
char d2path[MAXPATHLEN];
char idpath[MAXPATHLEN];

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

29
SOURCES/libpfm-zen4.patch Normal file
View File

@ -0,0 +1,29 @@
commit 1befa3d200cc17d5a278fcb2f597c4876c58f949
Author: Stephane Eranian <eranian@gmail.com>
Date: Tue Apr 25 00:35:41 2023 -0700
fix AMD Zen3/Zen4 detection
To cover more models of Zen4.
Signed-off-by: Stephane Eranian <eranian@gmail.com>
diff --git a/lib/pfmlib_amd64.c b/lib/pfmlib_amd64.c
index e51a43d..0c6702d 100644
--- a/lib/pfmlib_amd64.c
+++ b/lib/pfmlib_amd64.c
@@ -181,10 +181,10 @@ amd64_get_revision(pfm_amd64_config_t *cfg)
} else if (cfg->family == 22) { /* family 16h */
rev = PFM_PMU_AMD64_FAM16H;
} else if (cfg->family == 25) { /* family 19h */
- if (cfg->model <= 0x0f || (cfg->model >= 0x20 && cfg->model <= 0x5f)) {
- rev = PFM_PMU_AMD64_FAM19H_ZEN3;
- } else if (cfg->model == 17) {
- rev = PFM_PMU_AMD64_FAM19H_ZEN4;
+ if (cfg->model >= 0x60 || (cfg->model >= 0x10 && cfg->model <= 0x1f)) {
+ rev = PFM_PMU_AMD64_FAM19H_ZEN4;
+ } else {
+ rev = PFM_PMU_AMD64_FAM19H_ZEN3;
}
}

View File

@ -1,128 +0,0 @@
commit dc643f4a460063a628b4bfba57dbbb36673a0789
Author: Thomas Richter <tmricht@linux.ibm.com>
Date: Thu Jul 11 17:48:03 2019 -0700
s390/cpumf: add IBM z14 ZR1 support
Add support for machine type 0x3907.
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
diff --git a/lib/pfmlib_s390x_cpumf.c b/lib/pfmlib_s390x_cpumf.c
index 4e03fc4..7566aa0 100644
--- a/lib/pfmlib_s390x_cpumf.c
+++ b/lib/pfmlib_s390x_cpumf.c
@@ -192,6 +192,7 @@ static int pfm_cpumcf_init(void *this)
ext_set_count = LIBPFM_ARRAY_SIZE(cpumcf_z13_counters);
break;
case 3906: /* IBM z14 */
+ case 3907: /* IBM z14 ZR1 */
ext_set = cpumcf_z14_counters;
ext_set_count = LIBPFM_ARRAY_SIZE(cpumcf_z14_counters);
break;
commit c08003fb085e23f2229e58cc176fcfcf58a3b238
Author: Thomas Richter <tmricht@linux.ibm.com>
Date: Thu Jul 11 17:49:42 2019 -0700
s390/cpumf: add support for counter second version number 6
IBM added secound version number 6 in the CPU Measurement
Counter facility to indicate additional counters in the
crypto counter set.
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
diff --git a/lib/events/s390x_cpumf_events.h b/lib/events/s390x_cpumf_events.h
index 8be1d55..8587a3b 100644
--- a/lib/events/s390x_cpumf_events.h
+++ b/lib/events/s390x_cpumf_events.h
@@ -13,6 +13,8 @@
#define CPUMF_CTRSET_EXTENDED 1
#define CPUMF_CTRSET_MT_DIAG 32
+#define CPUMF_SVN6_ECC 4
+
static const pme_cpumf_ctr_t cpumcf_fvn1_counters[] = {
{
@@ -270,6 +272,43 @@ static const pme_cpumf_ctr_t cpumcf_svn_generic_counters[] = {
" coprocessor is busy performing a function issued by"
" another CPU",
},
+ {
+ .ctrnum = 80,
+ .ctrset = CPUMF_CTRSET_CRYPTO,
+ .name = "ECC_FUNCTION_COUNT",
+ .desc = "This counter counts the"
+ " total number of the elliptic-curve cryptography (ECC)"
+ " functions issued by the CPU.",
+ },
+ {
+ .ctrnum = 81,
+ .ctrset = CPUMF_CTRSET_CRYPTO,
+ .name = "ECC_CYCLES_COUNT",
+ .desc = "This counter counts the total"
+ " number of CPU cycles when the ECC coprocessor is"
+ " busy performing the elliptic-curve cryptography"
+ " (ECC) functions issued by the CPU.",
+ },
+ {
+ .ctrnum = 82,
+ .ctrset = CPUMF_CTRSET_CRYPTO,
+ .name = "ECC_BLOCKED_FUNCTION_COUNT",
+ .desc = "This counter counts the total number of the"
+ " elliptic-curve cryptography (ECC) functions that are"
+ " issued by the CPU and are blocked because the ECC"
+ " coprocessor is busy performing a function issued by"
+ " another CPU.",
+ },
+ {
+ .ctrnum = 83,
+ .ctrset = CPUMF_CTRSET_CRYPTO,
+ .name = "ECC_BLOCKED_CYCLES_COUNT",
+ .desc = "This counter counts the total number of CPU cycles "
+ " blocked for the elliptic-curve cryptography (ECC) "
+ " functions issued by the CPU because the ECC"
+ " coprocessor is busy perform ing a function issued"
+ " by another CPU.",
+ },
};
static const pme_cpumf_ctr_t cpumcf_z10_counters[] = {
diff --git a/lib/pfmlib_s390x_cpumf.c b/lib/pfmlib_s390x_cpumf.c
index 7566aa0..e68b000 100644
--- a/lib/pfmlib_s390x_cpumf.c
+++ b/lib/pfmlib_s390x_cpumf.c
@@ -168,6 +168,8 @@ static int pfm_cpumcf_init(void *this)
/* counters based on second version number */
csvn_set = cpumcf_svn_generic_counters;
csvn_set_count = LIBPFM_ARRAY_SIZE(cpumcf_svn_generic_counters);
+ if (csvn < 6) /* Crypto counter set enlarged for SVN == 6 */
+ csvn_set_count -= CPUMF_SVN6_ECC;
/* check and assign a machine-specific extended counter set */
switch (get_machine_type()) {
commit b831b04254ac7fd1700b20b349799810952ff66e
Author: Thomas Richter <tmricht@linux.ibm.com>
Date: Thu Jul 11 17:51:03 2019 -0700
s390/cpumf: add support for machine type 8561
Add extended counter set support for s390 machine types
8561 and 8562.
Signed-off-by: Thomas Richter <tmricht@linux.ibm.com>
diff --git a/lib/pfmlib_s390x_cpumf.c b/lib/pfmlib_s390x_cpumf.c
index e68b000..c11f9d9 100644
--- a/lib/pfmlib_s390x_cpumf.c
+++ b/lib/pfmlib_s390x_cpumf.c
@@ -195,6 +195,8 @@ static int pfm_cpumcf_init(void *this)
break;
case 3906: /* IBM z14 */
case 3907: /* IBM z14 ZR1 */
+ case 8561: /* IBM Machine types 8561 and 8562 */
+ case 8562:
ext_set = cpumcf_z14_counters;
ext_set_count = LIBPFM_ARRAY_SIZE(cpumcf_z14_counters);
break;

View File

@ -9,8 +9,8 @@
%endif
Name: libpfm
Version: 4.10.1
Release: 5%{?dist}
Version: 4.13.0
Release: 4%{?dist}
Summary: Library to encode performance events for use by perf tool
@ -19,12 +19,8 @@ License: MIT
URL: http://perfmon2.sourceforge.net/
Source0: http://sourceforge.net/projects/perfmon2/files/libpfm4/%{name}-%{version}.tar.gz
Patch2: libpfm-python3-setup.patch
Patch3: libpfm-zseries.patch
Patch4: libpfm-tx2.patch
Patch5: libpfm-a64fx.patch
Patch6: libpfm-flags.patch
Patch7: libpfm-amd_merge.patch
Patch8: libpfm-zen23.patch
Patch3: libpfm-initp.patch
Patch4: libpfm-zen4.patch
%if %{with python}
BuildRequires: python3
@ -75,12 +71,8 @@ Python bindings for libpfm4 and perf_event_open system call.
%prep
%setup -q
%patch2 -p1 -b .python3
%patch3 -p1 -b .zseries
%patch4 -p1 -b .tx2
%patch5 -p1 -b .a64fx
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch3 -p1 -b .test
%patch4 -p1 -b .zen4
%build
%if %{with python}
@ -129,6 +121,15 @@ make \
%endif
%changelog
* Mon Jun 12 2023 William cohen <wcohen@redhat.com> - 4.13.0-4
- Identify AMD Bergamo processors.
* Wed May 3 2023 William cohen <wcohen@redhat.com> - 4.13.0-3
- Rebuild for rhbz #2161146.
* Fri Apr 14 2023 William Cohen <wcohen@redhat.com> - 4.13.0-1
- Rebase to libpfm-4.13.0 (RHBZ #2185653)
* Sun May 8 2022 William Cohen <wcohen@redhat.com> - 4.10.1-5
- Add AMD Zen 2/3 support (RHBZ #2067218)