X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fmem_dlmalloc.c;h=f8d4ca19fd8e43d77d3ecdad6f03c1725b9352cb;hb=a606d9210;hp=a0bd1d09da25030a14a48ac63f91de7aae6dcdc6;hpb=bfa75d6b922ee15d2f0d00999fd36b03a85eda8c;p=vpp.git diff --git a/src/vppinfra/mem_dlmalloc.c b/src/vppinfra/mem_dlmalloc.c index a0bd1d09da2..f8d4ca19fd8 100644 --- a/src/vppinfra/mem_dlmalloc.c +++ b/src/vppinfra/mem_dlmalloc.c @@ -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;