Skip to content

Commit

Permalink
perf: fix init error is some event is not available
Browse files Browse the repository at this point in the history
  • Loading branch information
ryncsn committed Feb 2, 2021
1 parent 7021891 commit fe58f76
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 19 deletions.
22 changes: 11 additions & 11 deletions src/backend/perf-events.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,27 +270,28 @@ const struct perf_event_table_entry perf_event_table[] = {
// { &get_perf_event(sys_enter_init_module), perf_handle_module_load, always_enable },
{ &get_perf_event(sys_exit_init_module), perf_handle_sys_exit_init_module, always_enable },
{ &get_perf_event(sys_exit), perf_handle_sys_exit_init_module, always_enable },
{ &get_perf_event(sched_process_exec), perf_handle_process_exec, always_enable },
{ &get_perf_event(sched_process_exec), perf_handle_process_exec, always_enable },
};

const int perf_event_entry_number = sizeof(perf_event_table) / sizeof(struct perf_event_table_entry);

int perf_init(int buf_size)
int perf_events_init(int buf_size)
{
int ret;
int perf_event_enabled_num = 0;
int total_factor = 0;
int buf_total_factor = 0;
size_t buf_per_factor, aligned_buf_size = 0;

for (int i = 0; i < perf_event_entry_number; ++i) {
ret = perf_do_load_event_info(perf_event_table[i].event);
if (ret)
return ret;
log_error("Perf event %s is not supported on this kernel, tracing could be inaccurate.\n", perf_event_table[i].event->name);

if (perf_event_table[i].is_enabled()) {
perf_event_enabled_num ++;
total_factor += perf_event_table[i].event->buf_factor;
}
if (!perf_event_table[i].is_enabled() || !perf_event_table[i].event->valid)
continue;

perf_event_enabled_num ++;
buf_total_factor += perf_event_table[i].event->buf_factor;
}

/* Check event requirements */
Expand All @@ -299,11 +300,11 @@ int perf_init(int buf_size)
return -1;
}

buf_size = buf_size / total_factor / page_size;
buf_size = buf_size / buf_total_factor / page_size;
if (buf_size == 0)
buf_size = 1;
buf_per_factor = buf_size * page_size;
log_debug("Using buffer size %ldKB\n", buf_per_factor * total_factor / 1024);
log_debug("Using buffer size %ldKB\n", buf_per_factor * buf_total_factor / 1024);

for (int i = 0; i < perf_event_entry_number; ++i) {
size_t size = page_size, max_size = perf_event_table[i].event->buf_factor * buf_per_factor;
Expand Down Expand Up @@ -338,7 +339,6 @@ int perf_init(int buf_size)

int perf_ring_setup(struct PerfEventRing *ring) {
struct perf_event_attr attr;
int ret = 0;
int perf_fd = 0;

memset(&attr, 0, sizeof(struct perf_event_attr));
Expand Down
3 changes: 1 addition & 2 deletions src/backend/perf-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,7 @@ extern const struct perf_event_table_entry perf_event_table[];

extern const int perf_event_entry_number;

int perf_init(int buf_per_cpu);
int perf_exit(void);
int perf_events_init(int buf_per_cpu);
int perf_ring_setup(struct PerfEventRing *ring);
int perf_ring_start_sampling(struct PerfEventRing *ring);
int perf_ring_process(struct PerfEventRing *ring);
Expand Down
16 changes: 10 additions & 6 deletions src/backend/perf.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,35 @@ static void assign_cpu_no(int cpu_no, void *rings) {
}

int perf_handling_init() {
int ret;
int ret, perf_event_enabled_num;
int cpu_num = perf_get_cpu_num();
const struct perf_event_table_entry *entry;

ret = perf_init(perf_buf_size_per_cpu);
ret = perf_events_init(perf_buf_size_per_cpu);
if (ret < 0) {
return ret;
}

perf_event_ring_num = ret * perf_get_cpu_num();
perf_event_enabled_num = ret;
perf_event_ring_num = perf_event_enabled_num * perf_get_cpu_num();
perf_event_rings = (struct PerfEventRing*)calloc(perf_event_ring_num, sizeof(struct PerfEventRing));

for (int i = 0; i < perf_event_entry_number; i++){
struct PerfEventRing *rings = perf_event_rings + (i * cpu_num);
for (int i = 0, j = 0; i < perf_event_entry_number; i++){
struct PerfEventRing *rings = perf_event_rings + (j * cpu_num);
entry = perf_event_table + i;

if (!entry->is_enabled() || !entry->event->valid)
if (!entry->is_enabled() || !entry->event->valid) {
continue;
}

for (int cpu = 0; cpu < cpu_num; cpu++) {
rings[cpu].event = entry->event;
rings[cpu].sample_handler = entry->handler;
}

for_each_online_cpu(assign_cpu_no, &rings);

j++;
}

for (int i = 0; i < perf_event_ring_num; i++) {
Expand Down

0 comments on commit fe58f76

Please sign in to comment.