X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fperfmon%2Fperfmon.h;h=967b92e0e4a6664c879427bc0a2878f10d42c811;hb=c3cb2075d;hp=61e44ea43d3aada5a94b0d3b609826618675c3ea;hpb=8b60fb0fe6e29aac1847c0b381c0f84165b27b61;p=vpp.git diff --git a/src/plugins/perfmon/perfmon.h b/src/plugins/perfmon/perfmon.h index 61e44ea43d3..967b92e0e4a 100644 --- a/src/plugins/perfmon/perfmon.h +++ b/src/plugins/perfmon/perfmon.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #define PERF_MAX_EVENTS 7 /* 3 fixed and 4 programmable */ @@ -30,8 +31,16 @@ typedef enum PERFMON_BUNDLE_TYPE_NODE, PERFMON_BUNDLE_TYPE_THREAD, PERFMON_BUNDLE_TYPE_SYSTEM, + PERFMON_BUNDLE_TYPE_MAX, } perfmon_bundle_type_t; +typedef enum +{ + PERFMON_OFFSET_TYPE_MMAP, + PERFMON_OFFSET_TYPE_METRICS, + PERFMON_OFFSET_TYPE_MAX, +} perfmon_offset_type_t; + typedef struct { u32 type_from_instance : 1; @@ -61,7 +70,12 @@ typedef struct } perfmon_instance_type_t; struct perfmon_source; -vlib_node_function_t perfmon_dispatch_wrapper; +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 clib_error_t *(perfmon_source_init_fn_t) (vlib_main_t *vm, struct perfmon_source *); @@ -78,8 +92,16 @@ typedef struct perfmon_source } perfmon_source_t; struct perfmon_bundle; + typedef clib_error_t *(perfmon_bundle_init_fn_t) (vlib_main_t *vm, struct perfmon_bundle *); + +typedef struct +{ + clib_cpu_supports_func_t cpu_supports; + perfmon_bundle_type_t bundle_type; +} perfmon_cpu_supports_t; + typedef struct perfmon_bundle { char *name; @@ -87,9 +109,16 @@ typedef struct perfmon_bundle char *source; char *footer; perfmon_bundle_type_t type; + perfmon_offset_type_t offset_type; u32 events[PERF_MAX_EVENTS]; u32 n_events; + u32 metrics[PERF_MAX_EVENTS]; + u32 n_metrics; + + perfmon_cpu_supports_t *cpu_supports; + u32 n_cpu_supports; + perfmon_bundle_init_fn_t *init_fn; char **column_headers; @@ -113,7 +142,14 @@ typedef struct CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); u64 n_calls; u64 n_packets; - u64 value[PERF_MAX_EVENTS]; + union + { + struct + { + u64 value[PERF_MAX_EVENTS]; + } t[2]; + u64 value[PERF_MAX_EVENTS * 2]; + }; } perfmon_node_stats_t; typedef struct @@ -121,6 +157,7 @@ typedef struct u8 n_events; u16 n_nodes; perfmon_node_stats_t *node_stats; + perfmon_bundle_t *bundle; struct perf_event_mmap_page *mmap_pages[PERF_MAX_EVENTS]; } perfmon_thread_runtime_t; @@ -133,6 +170,7 @@ typedef struct uword *source_by_name; perfmon_bundle_t *active_bundle; int is_running; + f64 sample_time; int *group_fds; int *fds_to_close; perfmon_instance_type_t *default_instance_type; @@ -141,6 +179,24 @@ typedef struct extern perfmon_main_t perfmon_main; +always_inline uword +perfmon_cpu_supported_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; + + /* 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; + + return type; +} + #define PERFMON_REGISTER_SOURCE(x) \ perfmon_source_t __perfmon_source_##x; \ static void __clib_constructor __perfmon_source_registration_##x (void) \ @@ -157,13 +213,14 @@ extern perfmon_main_t perfmon_main; { \ perfmon_main_t *pm = &perfmon_main; \ __perfmon_bundle_##x.next = pm->bundles; \ + __perfmon_bundle_##x.type = \ + perfmon_cpu_supported_bundle_type (&__perfmon_bundle_##x); \ pm->bundles = &__perfmon_bundle_##x; \ } \ perfmon_bundle_t __perfmon_bundle_##x void perfmon_reset (vlib_main_t *vm); -clib_error_t *perfmon_set (vlib_main_t *vm, perfmon_bundle_t *); -clib_error_t *perfmon_start (vlib_main_t *vm); +clib_error_t *perfmon_start (vlib_main_t *vm, perfmon_bundle_t *); clib_error_t *perfmon_stop (vlib_main_t *vm); #define PERFMON_STRINGS(...) \