diff options
author | Ray Kinsella <mdr@ashroe.eu> | 2022-01-28 05:01:52 +0000 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2022-01-30 15:08:18 +0000 |
commit | 7e8aeb876b3bf21075621e40c3c1aa2fa2874dfb (patch) | |
tree | 992beb415bdc81f07f30cec95c5b411347a4f635 /src/plugins/perfmon/intel/core.c | |
parent | 0a0e711cce0f29012ceb6bcde732c072415c2f96 (diff) |
perfmon: fix init of bundles with pseudo events
Previously Linux pseudo events were being counted as multiple fixed
events, such that a bundle with pseudo events could exceed the number of
available fixed counters. Reworked to ignore pseudo events in the
accounting for the moment.
Type: fix
Fixes: 0024e53ad
Signed-off-by: Ray Kinsella <mdr@ashroe.eu>
Change-Id: Ic938f8266fd04d7731afbd02e261c61ef22a8522
Diffstat (limited to 'src/plugins/perfmon/intel/core.c')
-rw-r--r-- | src/plugins/perfmon/intel/core.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/plugins/perfmon/intel/core.c b/src/plugins/perfmon/intel/core.c index d985d049712..08a27b6a73f 100644 --- a/src/plugins/perfmon/intel/core.c +++ b/src/plugins/perfmon/intel/core.c @@ -77,13 +77,22 @@ intel_core_init (vlib_main_t *vm, perfmon_source_t *src) return 0; } -u8 -intel_core_is_fixed (u32 event) +perfmon_event_type_t +intel_core_get_event_type (u32 event) { u64 config = events[event].config; u8 eventcode = (config & 0xFF); - - return !eventcode ? 1 : 0; + u8 umask = ((config >> 8) & 0xFF); + + if (!eventcode) /* is fixed or pseudo */ + { + if (umask >= 0x80) /* is pseudo */ + return PERFMON_EVENT_TYPE_PSEUDO; + else /* is fixed */ + return PERFMON_EVENT_TYPE_FIXED; + } + else + return PERFMON_EVENT_TYPE_GENERAL; } PERFMON_REGISTER_SOURCE (intel_core) = { @@ -92,6 +101,6 @@ PERFMON_REGISTER_SOURCE (intel_core) = { .events = events, .n_events = ARRAY_LEN (events), .init_fn = intel_core_init, - .is_fixed = intel_core_is_fixed, + .get_event_type = intel_core_get_event_type, .format_config = format_intel_core_config, }; |