perfmon: fix per-worker data initialization 13/24013/2
authorBenoît Ganne <bganne@cisco.com>
Mon, 16 Dec 2019 14:26:49 +0000 (15:26 +0100)
committerDamjan Marion <dmarion@me.com>
Tue, 17 Dec 2019 17:53:07 +0000 (17:53 +0000)
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>
MAINTAINERS
src/plugins/perfmon/perfmon.c
src/plugins/perfmon/perfmon_periodic.c

index 32b8914..158d503 100644 (file)
@@ -426,6 +426,11 @@ I: marvell
 M:     Damjan Marion <damarion@cisco.com>
 F:     src/plugins/marvell/
 
+Plugin - performance counter
+I:     perfmon
+M:     Dave Barach <dave@barachs.net>
+F:     src/plugins/perfmon/
+
 Plugin - PPPoE
 I:     pppoe
 M:     Hongjun Ni <hongjun.ni@intel.com>
index 552c887..7e276c3 100644 (file)
@@ -110,14 +110,8 @@ perfmon_init (vlib_main_t * vm)
   /* Default data collection interval */
   pm->timeout_interval = 2.0;  /* seconds */
   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[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[0], vec_len (vlib_mains) - 1);
-  vec_validate (pm->rdpmc_indices[1], vec_len (vlib_mains) - 1);
   pm->page_size = getpagesize ();
 
   pm->perfmon_table = 0;
index ac68c42..8498419 100644 (file)
@@ -130,6 +130,10 @@ enable_current_events (perfmon_main_t * pm)
 
   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,
                            pm->current_event + i);
 
@@ -169,6 +173,7 @@ enable_current_events (perfmon_main_t * pm)
              close (fd);
              return;
            }
+         CLIB_MEM_UNPOISON (p, pm->page_size);
        }
       else
        p = 0;
@@ -239,12 +244,18 @@ disable_events (perfmon_main_t * pm)
        clib_unix_warning ("disable ioctl");
 
       if (pm->perf_event_pages[i][my_thread_index])
-       if (munmap (pm->perf_event_pages[i][my_thread_index],
-                   pm->page_size) < 0)
-         clib_unix_warning ("munmap");
+       {
+         if (munmap (pm->perf_event_pages[i][my_thread_index],
+                     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]);
       pm->pm_fds[i][my_thread_index] = 0;
+
     }
 }