Line data Source code
1 : /* SPDX-License-Identifier: Apache-2.0 2 : * Copyright(c) 2022 Cisco Systems, Inc. 3 : */ 4 : 5 : #include <vlib/vlib.h> 6 : #include <vlib/unix/unix.h> 7 : #include <vlib/stats/stats.h> 8 : 9 : static clib_mem_heap_t **memory_heaps_vec; 10 : 11 : enum 12 : { 13 : STAT_MEM_TOTAL = 0, 14 : STAT_MEM_USED, 15 : STAT_MEM_FREE, 16 : STAT_MEM_USED_MMAP, 17 : STAT_MEM_TOTAL_ALLOC, 18 : STAT_MEM_FREE_CHUNKS, 19 : STAT_MEM_RELEASABLE, 20 : } stat_mem_usage_e; 21 : 22 : /* 23 : * Called from the stats periodic process to update memory counters. 24 : */ 25 : static void 26 2406 : stat_provider_mem_usage_update_fn (vlib_stats_collector_data_t *d) 27 : { 28 : clib_mem_usage_t usage; 29 : clib_mem_heap_t *heap; 30 2406 : counter_t **counters = d->entry->data; 31 : counter_t *cb; 32 : 33 2406 : heap = vec_elt (memory_heaps_vec, d->private_data); 34 2406 : clib_mem_get_heap_usage (heap, &usage); 35 2406 : cb = counters[0]; 36 2406 : cb[STAT_MEM_TOTAL] = usage.bytes_total; 37 2406 : cb[STAT_MEM_USED] = usage.bytes_used; 38 2406 : cb[STAT_MEM_FREE] = usage.bytes_free; 39 2406 : cb[STAT_MEM_USED_MMAP] = usage.bytes_used_mmap; 40 2406 : cb[STAT_MEM_TOTAL_ALLOC] = usage.bytes_max; 41 2406 : cb[STAT_MEM_FREE_CHUNKS] = usage.bytes_free_reclaimed; 42 2406 : cb[STAT_MEM_RELEASABLE] = usage.bytes_overhead; 43 2406 : } 44 : 45 : /* 46 : * Provide memory heap counters. 47 : * Two dimensional array of heap index and per-heap gauges. 48 : */ 49 : void 50 1118 : vlib_stats_register_mem_heap (clib_mem_heap_t *heap) 51 : { 52 1118 : vlib_stats_collector_reg_t r = {}; 53 : u32 idx; 54 : 55 1118 : vec_add1 (memory_heaps_vec, heap); 56 : 57 1118 : r.entry_index = idx = vlib_stats_add_counter_vector ("/mem/%s", heap->name); 58 1118 : vlib_stats_validate (idx, 0, STAT_MEM_RELEASABLE); 59 : 60 : /* Create symlink */ 61 1118 : vlib_stats_add_symlink (idx, STAT_MEM_USED, "/mem/%s/used", heap->name); 62 1118 : vlib_stats_add_symlink (idx, STAT_MEM_TOTAL, "/mem/%s/total", heap->name); 63 1118 : vlib_stats_add_symlink (idx, STAT_MEM_FREE, "/mem/%s/free", heap->name); 64 : 65 1118 : r.private_data = vec_len (memory_heaps_vec) - 1; 66 1118 : r.collect_fn = stat_provider_mem_usage_update_fn; 67 1118 : vlib_stats_register_collector_fn (&r); 68 1118 : }