stats: buffer gauge callbacks use index instead of name.
[vpp.git] / src / vlib / buffer.c
index c44d8e4..7581d9c 100644 (file)
@@ -46,6 +46,7 @@
 #include <vppinfra/linux/sysfs.h>
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
+#include <vpp/stats/stat_segment.h>
 
 #define VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA 16384
 #define VLIB_BUFFER_DEFAULT_BUFFERS_PER_NUMA_UNPRIV 8192
@@ -709,13 +710,75 @@ vlib_buffer_main_alloc (vlib_main_t * vm)
   bm->default_data_size = VLIB_BUFFER_DEFAULT_DATA_SIZE;
 }
 
+static u32
+buffer_get_cached (vlib_buffer_pool_t * bp)
+{
+  u32 cached = 0;
+  vlib_buffer_pool_thread_t *bpt;
+
+  /* *INDENT-OFF* */
+  vec_foreach (bpt, bp->threads)
+    cached += vec_len (bpt->cached_buffers);
+  /* *INDENT-ON* */
+
+  return cached;
+}
+
+static vlib_buffer_pool_t *
+buffer_get_by_index (vlib_buffer_main_t * bm, u32 index)
+{
+  vlib_buffer_pool_t *bp;
+  if (!bm->buffer_pools || vec_len (bm->buffer_pools) < index)
+    return 0;
+  bp = vec_elt_at_index (bm->buffer_pools, index);
+  if (!bp)
+    return 0;
+  return bp;
+}
+
+static void
+buffer_gauges_update_used_fn (stat_segment_directory_entry_t * e, u32 index)
+{
+  vlib_main_t *vm = vlib_get_main ();
+  vlib_buffer_pool_t *bp = buffer_get_by_index (vm->buffer_main, index);
+  if (!bp)
+    return;
+
+  e->value = bp->n_buffers - vec_len (bp->buffers) - buffer_get_cached (bp);
+}
+
+static void
+buffer_gauges_update_available_fn (stat_segment_directory_entry_t * e,
+                                  u32 index)
+{
+  vlib_main_t *vm = vlib_get_main ();
+  vlib_buffer_pool_t *bp = buffer_get_by_index (vm->buffer_main, index);
+  if (!bp)
+    return;
+
+  e->value = vec_len (bp->buffers);
+}
+
+static void
+buffer_gauges_update_cached_fn (stat_segment_directory_entry_t * e, u32 index)
+{
+  vlib_main_t *vm = vlib_get_main ();
+  vlib_buffer_pool_t *bp = buffer_get_by_index (vm->buffer_main, index);
+  if (!bp)
+    return;
+
+  e->value = buffer_get_cached (bp);
+}
+
 clib_error_t *
-vlib_buffer_main_init (struct vlib_main_t *vm)
+vlib_buffer_main_init (struct vlib_main_t * vm)
 {
   vlib_buffer_main_t *bm;
   clib_error_t *err;
   clib_bitmap_t *bmp = 0;
   u32 numa_node;
+  vlib_buffer_pool_t *bp;
+  u8 *name;
 
   vlib_buffer_main_alloc (vm);
 
@@ -743,6 +806,23 @@ vlib_buffer_main_init (struct vlib_main_t *vm)
 
   bm->n_numa_nodes = clib_bitmap_last_set (bmp) + 1;
 
+  vec_foreach (bp, bm->buffer_pools)
+  {
+    name = format (0, "/buffer/cached/%s%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);
+    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);
+    stat_segment_register_gauge (name, buffer_gauges_update_available_fn,
+                                bp - bm->buffer_pools);
+    vec_free (name);
+  }
+
+
 done:
   vec_free (bmp);
   return err;