commit 20bd642e0ebc2c1d29e39417ee4665271df43d93 Author: Stephane Eranian 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 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 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 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;