stats: memory heap counters
[vpp.git] / src / vppinfra / mem_dlmalloc.c
index a0bd1d0..f8d4ca1 100644 (file)
@@ -74,17 +74,17 @@ mheap_get_trace (uword offset, uword size)
   /* Spurious Coverity warnings be gone. */
   clib_memset (&trace, 0, sizeof (trace));
 
-  /* Skip our frame and mspace_get_aligned's frame */
-  n_callers = clib_backtrace (trace.callers, ARRAY_LEN (trace.callers), 2);
-  if (n_callers == 0)
-    return;
-
   clib_spinlock_lock (&tm->lock);
 
   /* Turn off tracing to avoid embarrassment... */
   save_enabled = tm->enabled;
   tm->enabled = 0;
 
+  /* Skip our frame and mspace_get_aligned's frame */
+  n_callers = clib_backtrace (trace.callers, ARRAY_LEN (trace.callers), 2);
+  if (n_callers == 0)
+    goto out;
+
   if (!tm->trace_by_callers)
     tm->trace_by_callers =
       hash_create_shmem (0, sizeof (trace.callers), sizeof (uword));
@@ -137,6 +137,8 @@ mheap_get_trace (uword offset, uword size)
   t->n_bytes += size;
   t->offset = offset;          /* keep a sample to autopsy */
   hash_set (tm->trace_index_by_offset, offset, t - tm->traces);
+
+out:
   tm->enabled = save_enabled;
   clib_spinlock_unlock (&tm->lock);
 }
@@ -260,28 +262,28 @@ clib_mem_init_internal (void *base, uword size,
   return h;
 }
 
-void *
+__clib_export void *
 clib_mem_init (void *memory, uword memory_size)
 {
   return clib_mem_init_internal (memory, memory_size,
                                 CLIB_MEM_PAGE_SZ_DEFAULT);
 }
 
-void *
+__clib_export void *
 clib_mem_init_with_page_size (uword memory_size,
                              clib_mem_page_sz_t log2_page_sz)
 {
   return clib_mem_init_internal (0, memory_size, log2_page_sz);
 }
 
-void *
+__clib_export void *
 clib_mem_init_thread_safe (void *memory, uword memory_size)
 {
   return clib_mem_init_internal (memory, memory_size,
                                 CLIB_MEM_PAGE_SZ_DEFAULT);
 }
 
-void
+__clib_export void
 clib_mem_destroy (void)
 {
   mheap_trace_main_t *tm = &mheap_trace_main;
@@ -416,7 +418,7 @@ format_mheap_trace (u8 * s, va_list * va)
   return s;
 }
 
-u8 *
+__clib_export u8 *
 format_clib_mem_heap (u8 * s, va_list * va)
 {
   clib_mem_heap_t *heap = va_arg (*va, clib_mem_heap_t *);
@@ -467,25 +469,28 @@ format_clib_mem_heap (u8 * s, va_list * va)
   return s;
 }
 
-void
+__clib_export void
 clib_mem_get_heap_usage (clib_mem_heap_t * heap, clib_mem_usage_t * usage)
 {
   struct dlmallinfo mi = mspace_mallinfo (heap->mspace);
 
-  /* TODO: Fill in some more values */
+  usage->bytes_total = mi.arena; /* non-mmapped space allocated from system */
+  usage->bytes_used = mi.uordblks;         /* total allocated space */
+  usage->bytes_free = mi.fordblks;         /* total free space */
+  usage->bytes_used_mmap = mi.hblkhd;      /* space in mmapped regions */
+  usage->bytes_max = mi.usmblks;           /* maximum total allocated space */
+  usage->bytes_free_reclaimed = mi.ordblks; /* number of free chunks */
+  usage->bytes_overhead = mi.keepcost; /* releasable (via malloc_trim) space */
+
+  /* Not supported */
+  usage->bytes_used_sbrk = 0;
   usage->object_count = 0;
-  usage->bytes_total = mi.arena;
-  usage->bytes_overhead = 0;
-  usage->bytes_max = 0;
-  usage->bytes_used = mi.uordblks;
-  usage->bytes_free = mi.fordblks;
-  usage->bytes_free_reclaimed = 0;
 }
 
 /* Call serial number for debugger breakpoints. */
 uword clib_mem_validate_serial = 0;
 
-void
+__clib_export void
 mheap_trace (clib_mem_heap_t * h, int enable)
 {
   (void) mspace_enable_disable_trace (h->mspace, enable);
@@ -494,7 +499,7 @@ mheap_trace (clib_mem_heap_t * h, int enable)
     mheap_trace_main_free (&mheap_trace_main);
 }
 
-void
+__clib_export void
 clib_mem_trace (int enable)
 {
   mheap_trace_main_t *tm = &mheap_trace_main;
@@ -516,7 +521,7 @@ clib_mem_is_traced (void)
   return mspace_is_traced (h->mspace);
 }
 
-uword
+__clib_export uword
 clib_mem_trace_enable_disable (uword enable)
 {
   uword rv;
@@ -527,7 +532,7 @@ clib_mem_trace_enable_disable (uword enable)
   return rv;
 }
 
-clib_mem_heap_t *
+__clib_export clib_mem_heap_t *
 clib_mem_create_heap (void *base, uword size, int is_locked, char *fmt, ...)
 {
   clib_mem_page_sz_t log2_page_sz = clib_mem_get_log2_page_size ();
@@ -557,7 +562,7 @@ clib_mem_create_heap (void *base, uword size, int is_locked, char *fmt, ...)
   return h;
 }
 
-void
+__clib_export void
 clib_mem_destroy_heap (clib_mem_heap_t * h)
 {
   mheap_trace_main_t *tm = &mheap_trace_main;
@@ -570,20 +575,20 @@ clib_mem_destroy_heap (clib_mem_heap_t * h)
     clib_mem_vm_unmap (h->base);
 }
 
-uword
+__clib_export uword
 clib_mem_get_heap_free_space (clib_mem_heap_t * h)
 {
   struct dlmallinfo dlminfo = mspace_mallinfo (h->mspace);
   return dlminfo.fordblks;
 }
 
-void *
+__clib_export void *
 clib_mem_get_heap_base (clib_mem_heap_t * h)
 {
   return h->base;
 }
 
-uword
+__clib_export uword
 clib_mem_get_heap_size (clib_mem_heap_t * heap)
 {
   return heap->size;