#include <vppinfra/error.h>
#include <linux/perf_event.h>
+#include <perfmon/perfmon_intel.h>
#define foreach_perfmon_event \
_(PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES, "cpu-cycles") \
u64 *vectors_this_counter;
} perfmon_capture_t;
-typedef struct
-{
- u32 cpuid;
- const char **table;
-} perfmon_cpuid_and_table_t;
-
typedef struct
{
u8 *name;
perfmon_capture_t *capture_pool;
uword *capture_by_thread_and_node_name;
- /* CPU-specific event tables, hash table of selected table (if any) */
- perfmon_cpuid_and_table_t *perfmon_tables;
- uword *perfmon_table;
+ /* vector of registered perfmon tables */
+ perfmon_intel_pmc_registration_t *perfmon_tables;
+
+ /* active table */
+ perfmon_intel_pmc_event_t *perfmon_table;
- /* vector of events to collect */
- perfmon_event_config_t *events_to_collect;
+ uword *pmc_event_by_name;
+
+ /* vector of single events to collect */
+ perfmon_event_config_t *single_events_to_collect;
+
+ /* vector of paired events to collect */
+ perfmon_event_config_t *paired_events_to_collect;
/* Base indices of synthetic event tuples */
u32 ipc_event_index;
/* Current event (index) being collected */
u32 current_event;
- u32 *rdpmc_indices;
+ int n_active;
+ u32 **rdpmc_indices;
/* mmap base / size of (mapped) struct perf_event_mmap_page */
- u8 **perf_event_pages;
+ u8 ***perf_event_pages;
u32 page_size;
/* Current perf_event file descriptors, per thread */
- int *pm_fds;
+ int **pm_fds;
+
+ /* thread bitmap */
+ uword *thread_bitmap;
/* Logging */
vlib_log_class_t log_class;