aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/perfmon/perfmon.c
diff options
context:
space:
mode:
authorRay Kinsella <mdr@ashroe.eu>2021-11-26 14:57:35 +0000
committerDamjan Marion <dmarion@me.com>2022-01-27 20:01:45 +0000
commit0024e53ad048ff0a3cb34bd95679606c11a7154b (patch)
tree704f03a531a5742dce054bc8254c206deaa510cb /src/plugins/perfmon/perfmon.c
parentae0e3e748f04a1fb9ad2393533a164611c417103 (diff)
perfmon: prune bundles by available pmu counters
Prune perfmon bundles that exceed the number of available pmu counters. Type: improvement Signed-off-by: Ray Kinsella <mdr@ashroe.eu> Change-Id: I70fec26bb8ca915f4b980963e06c2e43dfde5a23
Diffstat (limited to 'src/plugins/perfmon/perfmon.c')
-rw-r--r--src/plugins/perfmon/perfmon.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/plugins/perfmon/perfmon.c b/src/plugins/perfmon/perfmon.c
index 411a07dea30..15690361a7f 100644
--- a/src/plugins/perfmon/perfmon.c
+++ b/src/plugins/perfmon/perfmon.c
@@ -325,10 +325,36 @@ 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 };
+
+ /* how many does this uarch support */
+ if (!clib_get_pmu_counter_count (&cpu.fixed, &cpu.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++;
+
+ return cpu.general >= bl.general && cpu.fixed >= bl.fixed;
+}
+
+static_always_inline u8
is_bundle_supported (perfmon_bundle_t *b)
{
perfmon_cpu_supports_t *supports = b->cpu_supports;
+ if (!is_enough_counters (b))
+ return 0;
+
if (!b->cpu_supports)
return 1;
@@ -372,13 +398,6 @@ perfmon_init (vlib_main_t *vm)
clib_error_t *err;
uword *p;
- if (!is_bundle_supported (b))
- {
- log_debug ("skipping bundle '%s' - not supported", b->name);
- b = b->next;
- continue;
- }
-
if (hash_get_mem (pm->bundle_by_name, b->name) != 0)
clib_panic ("duplicate bundle name '%s'", b->name);
@@ -391,6 +410,13 @@ perfmon_init (vlib_main_t *vm)
}
b->src = (perfmon_source_t *) p[0];
+ if (!is_bundle_supported (b))
+ {
+ log_debug ("skipping bundle '%s' - not supported", b->name);
+ b = b->next;
+ continue;
+ }
+
if (b->init_fn && ((err = (b->init_fn) (vm, b))))
{
log_warn ("skipping bundle '%s' - %U", b->name, format_clib_error,