stats: fix crash on early init 32/17932/6
authorFilip Tehlar <ftehlar@cisco.com>
Thu, 28 Feb 2019 12:36:10 +0000 (04:36 -0800)
committerDamjan Marion <dmarion@me.com>
Mon, 4 Mar 2019 11:17:15 +0000 (11:17 +0000)
Change-Id: I911b5070f544c3556ad1ca584d42689c00cc38f3
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
src/vlib/buffer.c

index 7581d9c..9312e8c 100644 (file)
@@ -63,6 +63,17 @@ STATIC_ASSERT_OFFSET_OF (vlib_buffer_t, template_end, 64);
 
 u16 __vlib_buffer_external_hdr_size = 0;
 
+static void
+buffer_gauges_update_cached_fn (stat_segment_directory_entry_t * e,
+                               u32 index);
+
+static void
+buffer_gauges_update_available_fn (stat_segment_directory_entry_t * e,
+                                  u32 index);
+
+static void
+buffer_gauges_update_used_fn (stat_segment_directory_entry_t * e, u32 index);
+
 uword
 vlib_buffer_length_in_chain_slow_path (vlib_main_t * vm,
                                       vlib_buffer_t * b_first)
@@ -716,11 +727,15 @@ buffer_get_cached (vlib_buffer_pool_t * bp)
   u32 cached = 0;
   vlib_buffer_pool_thread_t *bpt;
 
+  clib_spinlock_lock (&bp->lock);
+
   /* *INDENT-OFF* */
   vec_foreach (bpt, bp->threads)
     cached += vec_len (bpt->cached_buffers);
   /* *INDENT-ON* */
 
+  clib_spinlock_unlock (&bp->lock);
+
   return cached;
 }
 
@@ -808,21 +823,20 @@ vlib_buffer_main_init (struct vlib_main_t * vm)
 
   vec_foreach (bp, bm->buffer_pools)
   {
-    name = format (0, "/buffer/cached/%s%c", bp->name, 0);
+    name = format (0, "/buffer-pools/%s/cached%c", bp->name, 0);
     stat_segment_register_gauge (name, buffer_gauges_update_cached_fn,
                                 bp - bm->buffer_pools);
     vec_free (name);
-    name = format (0, "/buffer/used/%s%c", bp->name, 0);
+    name = format (0, "/buffer-pools/%s/used%c", bp->name, 0);
     stat_segment_register_gauge (name, buffer_gauges_update_used_fn,
                                 bp - bm->buffer_pools);
     vec_free (name);
-    name = format (0, "/buffer/available/%s%c", bp->name, 0);
+    name = format (0, "/buffer-pools/%s/available%c", bp->name, 0);
     stat_segment_register_gauge (name, buffer_gauges_update_available_fn,
                                 bp - bm->buffer_pools);
     vec_free (name);
   }
 
-
 done:
   vec_free (bmp);
   return err;