perfmon: fix per-worker data initialization

When perfmon_init is called at initialization time worker threads are
not created yet and vec_len(vlib_mains) returns 1.
Initialize per-worker data when the number of workers is known, when
enabling data collection instead.

Type: fix

Change-Id: I36887cc7b2a3e88d9728d3cd7262d9b1c968dd3c
Signed-off-by: Benoît Ganne <bganne@cisco.com>
This commit is contained in:
Benoît Ganne
2019-12-16 15:26:49 +01:00
committed by Damjan Marion
parent e11dce20c9
commit 7176b800fa
3 changed files with 19 additions and 9 deletions

View File

@ -426,6 +426,11 @@ I: marvell
M: Damjan Marion <damarion@cisco.com> M: Damjan Marion <damarion@cisco.com>
F: src/plugins/marvell/ F: src/plugins/marvell/
Plugin - performance counter
I: perfmon
M: Dave Barach <dave@barachs.net>
F: src/plugins/perfmon/
Plugin - PPPoE Plugin - PPPoE
I: pppoe I: pppoe
M: Hongjun Ni <hongjun.ni@intel.com> M: Hongjun Ni <hongjun.ni@intel.com>

View File

@ -110,14 +110,8 @@ perfmon_init (vlib_main_t * vm)
/* Default data collection interval */ /* Default data collection interval */
pm->timeout_interval = 2.0; /* seconds */ pm->timeout_interval = 2.0; /* seconds */
vec_validate (pm->pm_fds, 1); vec_validate (pm->pm_fds, 1);
vec_validate (pm->pm_fds[0], vec_len (vlib_mains) - 1);
vec_validate (pm->pm_fds[1], vec_len (vlib_mains) - 1);
vec_validate (pm->perf_event_pages, 1); vec_validate (pm->perf_event_pages, 1);
vec_validate (pm->perf_event_pages[0], vec_len (vlib_mains) - 1);
vec_validate (pm->perf_event_pages[1], vec_len (vlib_mains) - 1);
vec_validate (pm->rdpmc_indices, 1); vec_validate (pm->rdpmc_indices, 1);
vec_validate (pm->rdpmc_indices[0], vec_len (vlib_mains) - 1);
vec_validate (pm->rdpmc_indices[1], vec_len (vlib_mains) - 1);
pm->page_size = getpagesize (); pm->page_size = getpagesize ();
pm->perfmon_table = 0; pm->perfmon_table = 0;

View File

@ -130,6 +130,10 @@ enable_current_events (perfmon_main_t * pm)
for (i = 0; i < limit; i++) for (i = 0; i < limit; i++)
{ {
vec_validate (pm->pm_fds[i], vec_len (vlib_mains) - 1);
vec_validate (pm->perf_event_pages[i], vec_len (vlib_mains) - 1);
vec_validate (pm->rdpmc_indices[i], vec_len (vlib_mains) - 1);
c = vec_elt_at_index (pm->single_events_to_collect, c = vec_elt_at_index (pm->single_events_to_collect,
pm->current_event + i); pm->current_event + i);
@ -169,6 +173,7 @@ enable_current_events (perfmon_main_t * pm)
close (fd); close (fd);
return; return;
} }
CLIB_MEM_UNPOISON (p, pm->page_size);
} }
else else
p = 0; p = 0;
@ -239,12 +244,18 @@ disable_events (perfmon_main_t * pm)
clib_unix_warning ("disable ioctl"); clib_unix_warning ("disable ioctl");
if (pm->perf_event_pages[i][my_thread_index]) if (pm->perf_event_pages[i][my_thread_index])
if (munmap (pm->perf_event_pages[i][my_thread_index], {
pm->page_size) < 0) if (munmap (pm->perf_event_pages[i][my_thread_index],
clib_unix_warning ("munmap"); pm->page_size) < 0)
clib_unix_warning ("munmap");
CLIB_MEM_POISON (pm->perf_event_pages[i][my_thread_index],
pm->page_size);
pm->perf_event_pages[i][my_thread_index] = 0;
}
(void) close (pm->pm_fds[i][my_thread_index]); (void) close (pm->pm_fds[i][my_thread_index]);
pm->pm_fds[i][my_thread_index] = 0; pm->pm_fds[i][my_thread_index] = 0;
} }
} }