|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH 11/18] lib/ukalloc: Global statistics
Provides a configuration option that collects a consolidated global
statistic over all allocators.
Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
lib/ukalloc/Config.uk | 10 ++++++++++
lib/ukalloc/exportsyms.uk | 2 ++
lib/ukalloc/include/uk/alloc.h | 4 ++++
lib/ukalloc/include/uk/alloc_impl.h | 14 ++++++++++++++
lib/ukalloc/stats.c | 15 +++++++++++++++
5 files changed, 45 insertions(+)
diff --git a/lib/ukalloc/Config.uk b/lib/ukalloc/Config.uk
index fc64a13b..ffeec00e 100644
--- a/lib/ukalloc/Config.uk
+++ b/lib/ukalloc/Config.uk
@@ -16,4 +16,14 @@ if LIBUKALLOC
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
diff --git a/lib/ukalloc/exportsyms.uk b/lib/ukalloc/exportsyms.uk
index 48de908c..f6765b5c 100644
--- a/lib/ukalloc/exportsyms.uk
+++ b/lib/ukalloc/exportsyms.uk
@@ -21,3 +21,5 @@ uk_alloc_availmem_total
uk_alloc_pavail_total
_uk_alloc_head
uk_alloc_stats
+_uk_alloc_stats_global
+uk_alloc_stats_global
diff --git a/lib/ukalloc/include/uk/alloc.h b/lib/ukalloc/include/uk/alloc.h
index 59155d8c..28137e4e 100644
--- a/lib/ukalloc/include/uk/alloc.h
+++ b/lib/ukalloc/include/uk/alloc.h
@@ -310,6 +310,10 @@ unsigned long uk_alloc_pavail_total(void);
* Memory allocation statistics
*/
void uk_alloc_stats(struct uk_alloc *a, struct uk_alloc_stats *dst);
+
+#if CONFIG_LIBUKALLOC_IFSTATS_GLOBAL
+void uk_alloc_stats_global(struct uk_alloc_stats *dst);
+#endif /* CONFIG_LIBUKALLOC_IFSTATS_GLOBAL */
#endif /* CONFIG_LIBUKALLOC_IFSTATS */
#ifdef __cplusplus
diff --git a/lib/ukalloc/include/uk/alloc_impl.h
b/lib/ukalloc/include/uk/alloc_impl.h
index 9ef6df13..961e36b5 100644
--- a/lib/ukalloc/include/uk/alloc_impl.h
+++ b/lib/ukalloc/include/uk/alloc_impl.h
@@ -141,6 +141,18 @@ static inline void _uk_alloc_stats_count_free(struct
uk_alloc_stats *stats,
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:
@@ -150,6 +162,7 @@ static inline void _uk_alloc_stats_count_free(struct
uk_alloc_stats *stats,
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), \
@@ -166,6 +179,7 @@ static inline void _uk_alloc_stats_count_free(struct
uk_alloc_stats *stats,
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), \
diff --git a/lib/ukalloc/stats.c b/lib/ukalloc/stats.c
index 26dcc405..2505d278 100644
--- a/lib/ukalloc/stats.c
+++ b/lib/ukalloc/stats.c
@@ -35,6 +35,10 @@
#include <uk/preempt.h>
#include <uk/alloc_impl.h>
+#if CONFIG_LIBUKALLOC_IFSTATS_GLOBAL
+struct uk_alloc_stats _uk_alloc_stats_global = { 0 };
+#endif
+
void uk_alloc_stats(struct uk_alloc *a,
struct uk_alloc_stats *dst)
{
@@ -45,3 +49,14 @@ void uk_alloc_stats(struct uk_alloc *a,
memcpy(dst, &a->_stats, sizeof(*dst));
uk_preempt_enable();
}
+
+#if CONFIG_LIBUKALLOC_IFSTATS_GLOBAL
+void uk_alloc_stats_global(struct uk_alloc_stats *dst)
+{
+ UK_ASSERT(dst);
+
+ uk_preempt_disable();
+ memcpy(dst, &_uk_alloc_stats_global, sizeof(*dst));
+ uk_preempt_enable();
+}
+#endif
--
2.20.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |