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/perfmon.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/perfmon.c')
-rw-r--r-- | src/plugins/perfmon/perfmon.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/plugins/perfmon/perfmon.c b/src/plugins/perfmon/perfmon.c index 594a98759c8..b0c46b8edfc 100644 --- a/src/plugins/perfmon/perfmon.c +++ b/src/plugins/perfmon/perfmon.c @@ -327,24 +327,30 @@ perfmon_stop (vlib_main_t *vm) static_always_inline u8 is_enough_counters (perfmon_bundle_t *b) { - struct - { - u8 general; - u8 fixed; - } bl = { 0, 0 }, cpu = { 0, 0 }; + u8 bl[PERFMON_EVENT_TYPE_MAX]; + u8 cpu[PERFMON_EVENT_TYPE_MAX]; + + clib_memset (&bl, 0, sizeof (bl)); + clib_memset (&cpu, 0, sizeof (cpu)); /* how many does this uarch support */ - if (!clib_get_pmu_counter_count (&cpu.fixed, &cpu.general)) + if (!clib_get_pmu_counter_count (&cpu[PERFMON_EVENT_TYPE_FIXED], + &cpu[PERFMON_EVENT_TYPE_GENERAL])) return 0; /* how many does the bundle require */ for (u16 i = 0; i < b->n_events; i++) - if (b->src->is_fixed && b->src->is_fixed (b->events[i])) - bl.fixed++; - else - bl.general++; + { + /* if source allows us to identify events, otherwise assume general */ + if (b->src->get_event_type) + bl[b->src->get_event_type (b->events[i])]++; + else + bl[PERFMON_EVENT_TYPE_GENERAL]++; + } - return cpu.general >= bl.general && cpu.fixed >= bl.fixed; + /* consciously ignoring pseudo events here */ + return cpu[PERFMON_EVENT_TYPE_GENERAL] >= bl[PERFMON_EVENT_TYPE_GENERAL] && + cpu[PERFMON_EVENT_TYPE_FIXED] >= bl[PERFMON_EVENT_TYPE_FIXED]; } static_always_inline u8 |