default n
help
Provide interfaces for querying allocator statistics.
+
+ config LIBUKALLOC_IFSTATS_GLOBAL
+ bool "Global statistics"
+ default n
+ depends on LIBUKALLOC_IFSTATS
+ help
+ Compute consolidated global allocator statistics.
+ Please note that this option may slow down allocation
+ perfomance due to competition to the single global
+ counters.
endif
uk_preempt_enable();
}
+#if CONFIG_LIBUKALLOC_IFSTATS_GLOBAL
+#define _uk_alloc_stats_global_count_alloc(ptr, size) \
+ _uk_alloc_stats_count_alloc(&_uk_alloc_stats_global, (ptr), (size))
+#define _uk_alloc_stats_global_count_free(ptr, freed_size) \
+ _uk_alloc_stats_count_free(&_uk_alloc_stats_global, (ptr), (freed_size))
+#else /* !CONFIG_LIBUKALLOC_IFSTATS_GLOBAL */
+#define _uk_alloc_stats_global_count_alloc(ptr, size) \
+ do {} while (0)
+#define _uk_alloc_stats_global_count_free(ptr, freed_size) \
+ do {} while (0)
+#endif /* !CONFIG_LIBUKALLOC_IFSTATS_GLOBAL */
+
/*
* The following macros should be used to instrument an allocator for
* statistics:
*/
/* NOTE: If ptr is NULL, an ENOMEM event is counted */
#define uk_alloc_stats_count_alloc(a, ptr, size) \
- _uk_alloc_stats_count_alloc(&((a)->_stats), \
- (ptr), (size))
+ do { \
+ _uk_alloc_stats_count_alloc(&((a)->_stats), \
+ (ptr), (size)); \
+ _uk_alloc_stats_global_count_alloc((ptr), (size)); \
+ } while (0)
#define uk_alloc_stats_count_palloc(a, ptr, num_pages) \
uk_alloc_stats_count_alloc((a), (ptr), \
((size_t) (num_pages)) << __PAGE_SHIFT)
/* Note: if ptr is NULL, nothing is counted */
#define uk_alloc_stats_count_free(a, ptr, freed_size) \
- _uk_alloc_stats_count_free(&((a)->_stats), \
- (ptr), (freed_size))
+ do { \
+ _uk_alloc_stats_count_free(&((a)->_stats), \
+ (ptr), (freed_size)); \
+ _uk_alloc_stats_global_count_free((ptr), (freed_size)); \
+ } while (0)
#define uk_alloc_stats_count_pfree(a, ptr, num_pages) \
uk_alloc_stats_count_free((a), (ptr), \
((size_t) (num_pages)) << __PAGE_SHIFT)
#include <uk/alloc_impl.h>
+#if CONFIG_LIBUKALLOC_IFSTATS_GLOBAL
+struct uk_alloc_stats _uk_alloc_stats_global = { 0 };
+#endif
+
void uk_alloc_stats_get(struct uk_alloc *a,
struct uk_alloc_stats *dst)
{
memcpy(dst, &a->_stats, sizeof(*dst));
uk_preempt_enable();
}
+
+#if CONFIG_LIBUKALLOC_IFSTATS_GLOBAL
+void uk_alloc_stats_get_global(struct uk_alloc_stats *dst)
+{
+ UK_ASSERT(dst);
+
+ uk_preempt_disable();
+ memcpy(dst, &_uk_alloc_stats_global, sizeof(*dst));
+ uk_preempt_enable();
+}
+#endif