diff options
Diffstat (limited to 'src/plugins/perfmon/perfmon.h')
-rw-r--r-- | src/plugins/perfmon/perfmon.h | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/src/plugins/perfmon/perfmon.h b/src/plugins/perfmon/perfmon.h new file mode 100644 index 00000000000..61e44ea43d3 --- /dev/null +++ b/src/plugins/perfmon/perfmon.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2020 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __perfmon_perfmon_h +#define __perfmon_perfmon_h + +#include <linux/perf_event.h> +#include <vppinfra/clib.h> +#include <vppinfra/format.h> +#include <vppinfra/error.h> +#include <vlib/vlib.h> + +#define PERF_MAX_EVENTS 7 /* 3 fixed and 4 programmable */ + +typedef enum +{ + PERFMON_BUNDLE_TYPE_UNKNOWN, + PERFMON_BUNDLE_TYPE_NODE, + PERFMON_BUNDLE_TYPE_THREAD, + PERFMON_BUNDLE_TYPE_SYSTEM, +} perfmon_bundle_type_t; + +typedef struct +{ + u32 type_from_instance : 1; + u32 exclude_kernel : 1; + union + { + u32 type; + u32 instance_type; + }; + u64 config; + char *name; + char *description; +} perfmon_event_t; + +typedef struct +{ + u32 type; + int cpu; + pid_t pid; + char *name; +} perfmon_instance_t; + +typedef struct +{ + char *name; + perfmon_instance_t *instances; +} perfmon_instance_type_t; + +struct perfmon_source; +vlib_node_function_t perfmon_dispatch_wrapper; + +typedef clib_error_t *(perfmon_source_init_fn_t) (vlib_main_t *vm, + struct perfmon_source *); +typedef struct perfmon_source +{ + char *name; + char *description; + struct perfmon_source *next; + perfmon_event_t *events; + u32 n_events; + perfmon_instance_type_t *instances_by_type; + format_function_t *format_config; + perfmon_source_init_fn_t *init_fn; +} perfmon_source_t; + +struct perfmon_bundle; +typedef clib_error_t *(perfmon_bundle_init_fn_t) (vlib_main_t *vm, + struct perfmon_bundle *); +typedef struct perfmon_bundle +{ + char *name; + char *description; + char *source; + char *footer; + perfmon_bundle_type_t type; + u32 events[PERF_MAX_EVENTS]; + u32 n_events; + + perfmon_bundle_init_fn_t *init_fn; + + char **column_headers; + format_function_t *format_fn; + + /* do not set manually */ + perfmon_source_t *src; + struct perfmon_bundle *next; +} perfmon_bundle_t; + +typedef struct +{ + u64 nr; + u64 time_enabled; + u64 time_running; + u64 value[PERF_MAX_EVENTS]; +} perfmon_reading_t; + +typedef struct +{ + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + u64 n_calls; + u64 n_packets; + u64 value[PERF_MAX_EVENTS]; +} perfmon_node_stats_t; + +typedef struct +{ + u8 n_events; + u16 n_nodes; + perfmon_node_stats_t *node_stats; + struct perf_event_mmap_page *mmap_pages[PERF_MAX_EVENTS]; +} perfmon_thread_runtime_t; + +typedef struct +{ + perfmon_thread_runtime_t *thread_runtimes; + perfmon_bundle_t *bundles; + uword *bundle_by_name; + perfmon_source_t *sources; + uword *source_by_name; + perfmon_bundle_t *active_bundle; + int is_running; + int *group_fds; + int *fds_to_close; + perfmon_instance_type_t *default_instance_type; + perfmon_instance_type_t *active_instance_type; +} perfmon_main_t; + +extern perfmon_main_t perfmon_main; + +#define PERFMON_REGISTER_SOURCE(x) \ + perfmon_source_t __perfmon_source_##x; \ + static void __clib_constructor __perfmon_source_registration_##x (void) \ + { \ + perfmon_main_t *pm = &perfmon_main; \ + __perfmon_source_##x.next = pm->sources; \ + pm->sources = &__perfmon_source_##x; \ + } \ + perfmon_source_t __perfmon_source_##x + +#define PERFMON_REGISTER_BUNDLE(x) \ + perfmon_bundle_t __perfmon_bundle_##x; \ + static void __clib_constructor __perfmon_bundle_registration_##x (void) \ + { \ + perfmon_main_t *pm = &perfmon_main; \ + __perfmon_bundle_##x.next = pm->bundles; \ + 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_stop (vlib_main_t *vm); + +#define PERFMON_STRINGS(...) \ + (char *[]) { __VA_ARGS__, 0 } + +#endif |