diff options
Diffstat (limited to 'src/plugins/perfmon/perfmon.h')
-rw-r--r-- | src/plugins/perfmon/perfmon.h | 109 |
1 files changed, 82 insertions, 27 deletions
diff --git a/src/plugins/perfmon/perfmon.h b/src/plugins/perfmon/perfmon.h index ffcf2fd5e46..b76cf4b2138 100644 --- a/src/plugins/perfmon/perfmon.h +++ b/src/plugins/perfmon/perfmon.h @@ -23,7 +23,19 @@ #include <vppinfra/cpu.h> #include <vlib/vlib.h> -#define PERF_MAX_EVENTS 8 /* 4 fixed and 8 programmable on ICX */ +#if defined(__x86_64__) +#define PERF_MAX_EVENTS 12 /* 4 fixed and 8 programable on ICX */ +#elif defined(__aarch64__) +#define PERF_MAX_EVENTS 7 /* 6 events + 1 CPU cycle counter */ +#endif + +typedef enum +{ + PERFMON_EVENT_TYPE_GENERAL, + PERFMON_EVENT_TYPE_FIXED, + PERFMON_EVENT_TYPE_PSEUDO, + PERFMON_EVENT_TYPE_MAX, +} perfmon_event_type_t; typedef enum { @@ -32,19 +44,29 @@ typedef enum PERFMON_BUNDLE_TYPE_THREAD, PERFMON_BUNDLE_TYPE_SYSTEM, PERFMON_BUNDLE_TYPE_MAX, + PERFMON_BUNDLE_TYPE_NODE_OR_THREAD, } perfmon_bundle_type_t; +#define foreach_perfmon_bundle_type \ + _ (PERFMON_BUNDLE_TYPE_UNKNOWN, "not supported") \ + _ (PERFMON_BUNDLE_TYPE_NODE, "node") \ + _ (PERFMON_BUNDLE_TYPE_THREAD, "thread") \ + _ (PERFMON_BUNDLE_TYPE_SYSTEM, "system") + typedef enum { - PERFMON_OFFSET_TYPE_MMAP, - PERFMON_OFFSET_TYPE_METRICS, - PERFMON_OFFSET_TYPE_MAX, -} perfmon_offset_type_t; +#define _(e, str) e##_FLAG = 1 << e, + foreach_perfmon_bundle_type +#undef _ + +} perfmon_bundle_type_flag_t; typedef struct { u32 type_from_instance : 1; u32 exclude_kernel : 1; + u32 config1 : 2; + u32 implemented : 1; union { u32 type; @@ -70,15 +92,15 @@ typedef struct } perfmon_instance_type_t; struct perfmon_source; -vlib_node_function_t perfmon_dispatch_wrapper_mmap; -vlib_node_function_t perfmon_dispatch_wrapper_metrics; - -#define foreach_permon_offset_type \ - _ (PERFMON_OFFSET_TYPE_MMAP, perfmon_dispatch_wrapper_mmap) \ - _ (PERFMON_OFFSET_TYPE_METRICS, perfmon_dispatch_wrapper_metrics) +typedef struct perfmon_bundle perfmon_bundle_t; typedef clib_error_t *(perfmon_source_init_fn_t) (vlib_main_t *vm, struct perfmon_source *); +typedef perfmon_event_type_t (perfmon_source_get_event_type) (u32 event); +typedef u8 (perfmon_source_bundle_support_t) (perfmon_bundle_t *); +typedef clib_error_t *(perfmon_source_config_dispatch_wrapper_t) ( + perfmon_bundle_t *b, vlib_node_function_t **dispatch_wrapper); + typedef struct perfmon_source { char *name; @@ -88,11 +110,12 @@ typedef struct perfmon_source u32 n_events; perfmon_instance_type_t *instances_by_type; format_function_t *format_config; + perfmon_source_get_event_type *get_event_type; perfmon_source_init_fn_t *init_fn; + perfmon_source_bundle_support_t *bundle_support; + perfmon_source_config_dispatch_wrapper_t *config_dispatch_wrapper; } perfmon_source_t; -struct perfmon_bundle; - typedef clib_error_t *(perfmon_bundle_init_fn_t) (vlib_main_t *vm, struct perfmon_bundle *); @@ -108,13 +131,23 @@ typedef struct perfmon_bundle char *description; char *source; char *footer; - perfmon_bundle_type_t type; - perfmon_offset_type_t offset_type; + + union + { + perfmon_bundle_type_flag_t type_flags; + perfmon_bundle_type_t type; + }; + perfmon_bundle_type_t active_type; + u32 events[PERF_MAX_EVENTS]; u32 n_events; + u32 n_columns; + + uword *event_disabled; + uword *column_disabled; + u8 *column_events; - u32 metrics[PERF_MAX_EVENTS]; - u32 n_metrics; + u16 preserve_samples; perfmon_cpu_supports_t *cpu_supports; u32 n_cpu_supports; @@ -158,6 +191,8 @@ typedef struct u16 n_nodes; perfmon_node_stats_t *node_stats; perfmon_bundle_t *bundle; + u32 indexes[PERF_MAX_EVENTS]; + u16 preserve_samples; struct perf_event_mmap_page *mmap_pages[PERF_MAX_EVENTS]; } perfmon_thread_runtime_t; @@ -179,23 +214,40 @@ typedef struct extern perfmon_main_t perfmon_main; +#define PERFMON_BUNDLE_TYPE_TO_FLAGS(type) \ + ({ \ + uword rtype = 0; \ + if (type == PERFMON_BUNDLE_TYPE_NODE_OR_THREAD) \ + rtype = \ + 1 << PERFMON_BUNDLE_TYPE_THREAD | 1 << PERFMON_BUNDLE_TYPE_NODE; \ + else \ + rtype = 1 << type; \ + rtype; \ + }) + always_inline uword -perfmon_cpu_supported_bundle_type (perfmon_bundle_t *b) +perfmon_cpu_update_bundle_type (perfmon_bundle_t *b) { perfmon_cpu_supports_t *supports = b->cpu_supports; uword type = 0; - /* if nothing specific for this bundle, go with the default */ - if (!supports) - return b->type; + /* either supports or b->type should be set, but not both */ + ASSERT (!!supports ^ !!b->type); - /* the last specified type, will always win */ - for (int i = 0; i < b->n_cpu_supports; ++i) - if (supports[i].cpu_supports ()) - type = supports[i].bundle_type; + /* if nothing specific for this bundle, go with the defaults */ + if (!supports) + type = PERFMON_BUNDLE_TYPE_TO_FLAGS (b->type); + else + { + /* more than one type may be supported by a given bundle */ + for (int i = 0; i < b->n_cpu_supports; ++i) + if (supports[i].cpu_supports ()) + type |= PERFMON_BUNDLE_TYPE_TO_FLAGS (supports[i].bundle_type); + } return type; } +#undef PERFMON_BUNDLE_TYPE_TO_FLAGS #define PERFMON_REGISTER_SOURCE(x) \ perfmon_source_t __perfmon_source_##x; \ @@ -213,8 +265,8 @@ perfmon_cpu_supported_bundle_type (perfmon_bundle_t *b) { \ perfmon_main_t *pm = &perfmon_main; \ __perfmon_bundle_##x.next = pm->bundles; \ - __perfmon_bundle_##x.type = \ - perfmon_cpu_supported_bundle_type (&__perfmon_bundle_##x); \ + __perfmon_bundle_##x.type_flags = \ + perfmon_cpu_update_bundle_type (&__perfmon_bundle_##x); \ pm->bundles = &__perfmon_bundle_##x; \ } \ perfmon_bundle_t __perfmon_bundle_##x @@ -226,4 +278,7 @@ clib_error_t *perfmon_stop (vlib_main_t *vm); #define PERFMON_STRINGS(...) \ (char *[]) { __VA_ARGS__, 0 } +#define PERFMON_COLUMN_EVENTS(...) \ + (u8[]) { __VA_ARGS__ } + #endif |