X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fmem_dlmalloc.c;h=7a53a8bb43bbf5b82c7e10e89edc8e9f93d9c05f;hb=0455c435af501889de51c79a223883b3c2003b20;hp=2b49f8fa703765ee92ff420fc255a30652bdea3e;hpb=6a5adc369591fcac2447e9809deaa22f56b53911;p=vpp.git diff --git a/src/vppinfra/mem_dlmalloc.c b/src/vppinfra/mem_dlmalloc.c index 2b49f8fa703..7a53a8bb43b 100644 --- a/src/vppinfra/mem_dlmalloc.c +++ b/src/vppinfra/mem_dlmalloc.c @@ -56,6 +56,10 @@ typedef struct /* Hash table mapping mheap offset to trace index. */ uword *trace_index_by_offset; + + /* So we can easily shut off current segment trace, if any */ + void *current_traced_mheap; + } mheap_trace_main_t; mheap_trace_main_t mheap_trace_main; @@ -69,22 +73,17 @@ mheap_get_trace (uword offset, uword size) mheap_trace_t trace; uword save_enabled; - if (tm->enabled == 0) + if (tm->enabled == 0 || (clib_mem_get_heap () != tm->current_traced_mheap)) return; /* Spurious Coverity warnings be gone. */ - memset (&trace, 0, sizeof (trace)); + 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; - /* $$$ This looks like dreck to remove... */ - if (0) - for (i = n_callers; i < ARRAY_LEN (trace.callers); i++) - trace.callers[i] = 0; - clib_spinlock_lock (&tm->lock); /* Turn off tracing to avoid embarrassment... */ @@ -185,7 +184,7 @@ mheap_put_trace (uword offset, uword size) { hash_unset_mem (tm->trace_by_callers, t->callers); vec_add1 (tm->trace_free_list, trace_index); - memset (t, 0, sizeof (t[0])); + clib_memset (t, 0, sizeof (t[0])); } tm->enabled = save_enabled; clib_spinlock_unlock (&tm->lock); @@ -229,33 +228,6 @@ clib_mem_init_thread_safe (void *memory, uword memory_size) return clib_mem_init (memory, memory_size); } -#ifdef CLIB_LINUX_KERNEL -#include - -uword -clib_mem_get_page_size (void) -{ - return PAGE_SIZE; -} -#endif - -#ifdef CLIB_UNIX -uword -clib_mem_get_page_size (void) -{ - return getpagesize (); -} -#endif - -/* Make a guess for standalone. */ -#ifdef CLIB_STANDALONE -uword -clib_mem_get_page_size (void) -{ - return 4096; -} -#endif - u8 * format_clib_mem_usage (u8 * s, va_list * va) { @@ -318,7 +290,8 @@ format_mheap_trace (u8 * s, va_list * va) int i; clib_spinlock_lock (&tm->lock); - if (vec_len (tm->traces) > 0) + if (vec_len (tm->traces) > 0 && + clib_mem_get_heap () == tm->current_traced_mheap) { have_traces = 1; @@ -354,7 +327,7 @@ format_mheap_trace (u8 * s, va_list * va) { if (i > 0) s = format (s, "%U", format_white_space, indent); -#ifdef CLIB_UNIX +#if defined(CLIB_UNIX) && !defined(__APPLE__) /* $$$$ does this actually work? */ s = format (s, " %U\n", format_clib_elf_symbol_with_address, @@ -382,7 +355,7 @@ format_mheap (u8 * s, va_list * va) { void *heap = va_arg (*va, u8 *); int verbose = va_arg (*va, int); - struct mallinfo mi; + struct dlmallinfo mi; mheap_trace_main_t *tm = &mheap_trace_main; mi = mspace_mallinfo (heap); @@ -399,7 +372,8 @@ format_mheap (u8 * s, va_list * va) format (s, "\n max total allocated %U", format_msize, mi.usmblks); } - s = format (s, "\n%U", format_mheap_trace, tm, verbose); + if (mspace_is_traced (heap)) + s = format (s, "\n%U", format_mheap_trace, tm, verbose); return s; } @@ -409,6 +383,21 @@ clib_mem_usage (clib_mem_usage_t * u) clib_warning ("unimp"); } +void +mheap_usage (void *heap, clib_mem_usage_t * usage) +{ + struct dlmallinfo mi = mspace_mallinfo (heap); + + /* TODO: Fill in some more values */ + 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; @@ -431,9 +420,21 @@ void clib_mem_trace (int enable) { mheap_trace_main_t *tm = &mheap_trace_main; + void *current_heap = clib_mem_get_heap (); tm->enabled = enable; - mheap_trace (clib_mem_get_heap (), enable); + mheap_trace (current_heap, enable); + + if (enable) + tm->current_traced_mheap = current_heap; + else + tm->current_traced_mheap = 0; +} + +int +clib_mem_is_traced (void) +{ + return mspace_is_traced (clib_mem_get_heap ()); } uword