21 #include <asm/unistd.h> 22 #include <sys/ioctl.h> 26 int group_fd,
unsigned long flags)
30 ret = syscall (__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags);
95 struct perf_event_attr pe;
97 struct perf_event_mmap_page *p = 0;
104 memset (&pe, 0,
sizeof (
struct perf_event_attr));
106 pe.size =
sizeof (
struct perf_event_attr);
114 if (pe.type != PERF_TYPE_SOFTWARE)
117 pe.exclude_kernel = 1;
129 if (pe.type != PERF_TYPE_SOFTWARE)
131 p = mmap (0, pm->
page_size, PROT_READ, MAP_SHARED, fd, 0);
140 if (ioctl (fd, PERF_EVENT_IOC_RESET, 0) < 0)
143 if (ioctl (fd, PERF_EVENT_IOC_ENABLE, 0) < 0)
151 if (pe.type == PERF_TYPE_SOFTWARE || p->cap_user_rdpmc == 0)
157 pm->
pm_fds[my_thread_index] = fd;
171 if (pm->
pm_fds[my_thread_index] == 0)
177 if (ioctl (pm->
pm_fds[my_thread_index], PERF_EVENT_IOC_DISABLE, 0) < 0)
184 (void) close (pm->
pm_fds[my_thread_index]);
185 pm->
pm_fds[my_thread_index] = 0;
246 u64 vectors_this_counter;
292 nodes = node_dups[j];
294 for (i = 0; i <
vec_len (nodes); i++)
305 capture_name =
format (0,
"t%d-%v%c", j, n->
name, 0);
313 memset (c, 0,
sizeof (*c));
322 counter_name = (
u8 *) current_event->
name;
382 uword *event_data = 0;
400 for (i = 0; i <
vec_len (event_data); i++)
423 .name =
"perfmon-periodic-process",
perfmon_capture_t * capture_pool
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
static void worker_thread_start_event(vlib_main_t *vm)
u64 * vectors_this_counter
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
static void disable_event(perfmon_main_t *pm)
static uword * vlib_process_wait_for_event(vlib_main_t *vm)
perfmon_event_config_t * events_to_collect
static void clear_counters(perfmon_main_t *pm)
static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags)
#define clib_memcpy_fast(a, b, c)
static f64 vlib_time_now(vlib_main_t *vm)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define hash_set_mem(h, key, value)
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
vlib_main_t ** vlib_mains
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
#define vlib_worker_thread_barrier_sync(X)
static uword vlib_process_suspend(vlib_main_t *vm, f64 dt)
Suspend a vlib cooperative multi-tasking thread for a period of time.
vlib_node_stats_t stats_last_clear
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
u8 * thread_and_node_name
void scrape_and_clear_counters(perfmon_main_t *pm)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
vlib_node_stats_t stats_total
static void handle_timeout(perfmon_main_t *pm, f64 now)
u64(* vlib_node_runtime_perf_counter_cb)(struct vlib_main_t *)
static void worker_thread_stop_event(vlib_main_t *vm)
#define VLIB_REGISTER_NODE(x,...)
#define vec_free(V)
Free vector's memory (no header).
#define clib_warning(format, args...)
static u64 read_current_perf_counter(vlib_main_t *vm)
static void enable_current_event(perfmon_main_t *pm)
static void clib_mem_free(void *p)
static u64 clib_rdpmc(int counter_id)
perfmon_main_t perfmon_main
static void * clib_mem_alloc(uword size)
static vlib_main_t * vlib_get_main(void)
uword * capture_by_thread_and_node_name
static void start_event(perfmon_main_t *pm, f64 now, uword event_data)
void vlib_node_sync_stats(vlib_main_t *vm, vlib_node_t *n)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
vlib_node_main_t node_main
#define clib_unix_warning(format, args...)
#define hash_get_mem(h, key)
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
static uword perfmon_periodic_process(vlib_main_t *vm, vlib_node_runtime_t *rt, vlib_frame_t *f)
volatile void(* worker_thread_main_loop_callback)(struct vlib_main_t *)
vlib_node_registration_t perfmon_periodic_node
(constructor) VLIB_REGISTER_NODE (perfmon_periodic_node)