21 #include <vpp/app/version.h> 22 #include <linux/limits.h> 23 #include <sys/ioctl.h> 25 #include <perfmon/perfmon.h> 30 .version = VPP_BUILD_VER,
31 .description =
"Performance Monitor",
35 .class_name =
"perfmon",
38 #define log_debug(fmt, ...) \ 39 vlib_log_debug (if_default_log.class, fmt, __VA_ARGS__) 40 #define log_warn(fmt, ...) \ 41 vlib_log_warn (if_default_log.class, fmt, __VA_ARGS__) 42 #define log_err(fmt, ...) vlib_log_err (if_default_log.class, fmt, __VA_ARGS__) 91 u32 instance_type = 0;
106 it->
name = is_node ?
"Thread/Node" :
"Thread";
145 for (
int j = 0; j < b->
n_events; j++)
149 struct perf_event_attr pe = {
150 .size =
sizeof (
struct perf_event_attr),
155 (PERF_FORMAT_GROUP | PERF_FORMAT_TOTAL_TIME_ENABLED |
156 PERF_FORMAT_TOTAL_TIME_RUNNING),
160 log_debug (
"perf_event_open pe.type=%u pe.config=0x%x pid=%d " 161 "cpu=%d group_fd=%d",
163 fd = syscall (__NR_perf_event_open, &pe, in->
pid, in->
cpu,
182 mmap (0, page_size, PROT_READ, MAP_SHARED, fd, 0);
230 for (
int i = 0;
i < n_groups;
i++)
232 if (ioctl (pm->
group_fds[
i], PERF_EVENT_IOC_ENABLE,
233 PERF_IOC_FLAG_GROUP) == -1)
243 #define _(type, pfunc) funcs[type] = pfunc; 276 for (
int i = 0;
i < n_groups;
i++)
278 if (ioctl (pm->
group_fds[
i], PERF_EVENT_IOC_DISABLE,
279 PERF_IOC_FLAG_GROUP) == -1)
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
#define log_warn(fmt,...)
clib_error_t * perfmon_stop(vlib_main_t *vm)
perfmon_bundle_init_fn_t * init_fn
vnet_interface_output_runtime_t * rt
perfmon_bundle_t * active_bundle
struct perf_event_mmap_page * mmap_pages[PERF_MAX_EVENTS]
static f64 vlib_time_now(vlib_main_t *vm)
perfmon_instance_t * instances
perfmon_node_stats_t * node_stats
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
perfmon_thread_runtime_t * thread_runtimes
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define hash_set_mem(h, key, value)
#define vec_validate_aligned(V, I, A)
Make sure vector is long enough for given index (no header, specified alignment)
perfmon_instance_type_t * default_instance_type
static_always_inline uword clib_mem_get_page_size(void)
perfmon_main_t perfmon_main
VLIB_REGISTER_LOG_CLASS(if_default_log, static)
void perfmon_reset(vlib_main_t *vm)
u32 events[PERF_MAX_EVENTS]
#define VLIB_INIT_FUNCTION(x)
perfmon_instance_type_t * active_instance_type
description fragment has unexpected format
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
#define clib_error_return(e, args...)
#define hash_create_string(elts, value_bytes)
vlib_worker_thread_t * vlib_worker_threads
struct perfmon_bundle * next
#define clib_error_return_unix(e, args...)
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
perfmon_bundle_type_t type
sll srl srl sll sra u16x4 i
#define vec_free(V)
Free vector's memory (no header).
static int vlib_node_set_dispatch_wrapper(vlib_main_t *vm, vlib_node_function_t *fn)
perfmon_source_t * sources
perfmon_instance_type_t * instances_by_type
uword() vlib_node_function_t(struct vlib_main_t *vm, struct vlib_node_runtime_t *node, struct vlib_frame_t *frame)
perfmon_source_init_fn_t * init_fn
static u32 vlib_get_n_threads()
static clib_error_t * perfmon_set(vlib_main_t *vm, perfmon_bundle_t *b)
static clib_error_t * perfmon_init(vlib_main_t *vm)
static vlib_main_t * vlib_get_main_by_index(u32 thread_index)
struct perfmon_source * next
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
vlib_node_main_t node_main
perfmon_bundle_t * bundle
#define clib_error_free(e)
#define hash_get_mem(h, key)
#define foreach_permon_offset_type
save_rewrite_length must be aligned so that reass doesn t overwrite it
perfmon_offset_type_t offset_type
#define log_debug(fmt,...)
#define CLIB_CACHE_LINE_BYTES
clib_error_t * perfmon_start(vlib_main_t *vm, perfmon_bundle_t *b)
__clib_export u8 * format_clib_error(u8 *s, va_list *va)
#define clib_panic(format, args...)
perfmon_bundle_t * bundles