|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [UNIKRAFT PATCH v3 5/5] lib/ukallocpool: Batched allocation
Introduce low-overhead interfaces for batched allocations and batched
freeing of objects.
Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
---
lib/ukallocpool/exportsyms.uk | 2 ++
lib/ukallocpool/include/uk/allocpool.h | 30 ++++++++++++++++++++++++++
lib/ukallocpool/pool.c | 29 +++++++++++++++++++++++++
3 files changed, 61 insertions(+)
diff --git a/lib/ukallocpool/exportsyms.uk b/lib/ukallocpool/exportsyms.uk
index d119db32..5a6d9f6b 100644
--- a/lib/ukallocpool/exportsyms.uk
+++ b/lib/ukallocpool/exportsyms.uk
@@ -4,5 +4,7 @@ uk_allocpool_init
uk_allocpool_reqmem
uk_allocpool_availcount
uk_allocpool_take
+uk_allocpool_take_batch
uk_allocpool_return
+uk_allocpool_return_batch
uk_allocpool2ukalloc
diff --git a/lib/ukallocpool/include/uk/allocpool.h
b/lib/ukallocpool/include/uk/allocpool.h
index a60acb35..a9f9cb59 100644
--- a/lib/ukallocpool/include/uk/allocpool.h
+++ b/lib/ukallocpool/include/uk/allocpool.h
@@ -157,6 +157,22 @@ unsigned int uk_allocpool_availcount(struct uk_allocpool
*p);
*/
void *uk_allocpool_take(struct uk_allocpool *p);
+/**
+ * Get multiple objects from a pool.
+ *
+ * @param p
+ * Pointer to memory pool.
+ * @param obj
+ * Pointer to array that will be filled with pointers of
+ * allocated objects from the pool.
+ * @param count
+ * Maximum number of objects that should be taken from the pool
+ * @return
+ * Number of successfully allocated objects on the given array
+ */
+unsigned int uk_allocpool_take_batch(struct uk_allocpool *p,
+ void *obj[], unsigned int count);
+
/**
* Return one object back to a pool
* HINT: It is recommended to use this call instead of uk_free() whenever
@@ -169,6 +185,20 @@ void *uk_allocpool_take(struct uk_allocpool *p);
*/
void uk_allocpool_return(struct uk_allocpool *p, void *obj);
+/**
+ * Return multiple objects to a pool.
+ *
+ * @param p
+ * Pointer to memory pool.
+ * @param obj
+ * Pointer to array that with pointers of objects that
+ * should be returned.
+ * @param count
+ * Number of objects that are on the array.
+ */
+void uk_allocpool_return_batch(struct uk_allocpool *p,
+ void *obj[], unsigned int count);
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/ukallocpool/pool.c b/lib/ukallocpool/pool.c
index bcdef670..c84ccd46 100644
--- a/lib/ukallocpool/pool.c
+++ b/lib/ukallocpool/pool.c
@@ -170,6 +170,23 @@ void *uk_allocpool_take(struct uk_allocpool *p)
return _take_free_obj(p);
}
+unsigned int uk_allocpool_take_batch(struct uk_allocpool *p,
+ void *obj[], unsigned int count)
+{
+ unsigned int i;
+
+ UK_ASSERT(p);
+ UK_ASSERT(obj);
+
+ for (i = 0; i < count; ++i) {
+ if (unlikely(uk_list_empty(&p->free_obj)))
+ break;
+ obj[i] = _take_free_obj(p);
+ }
+
+ return i;
+}
+
void uk_allocpool_return(struct uk_allocpool *p, void *obj)
{
UK_ASSERT(p);
@@ -177,6 +194,18 @@ void uk_allocpool_return(struct uk_allocpool *p, void *obj)
_prepend_free_obj(p, obj);
}
+void uk_allocpool_return_batch(struct uk_allocpool *p,
+ void *obj[], unsigned int count)
+{
+ unsigned int i;
+
+ UK_ASSERT(p);
+ UK_ASSERT(obj);
+
+ for (i = 0; i < count; ++i)
+ _prepend_free_obj(p, obj[i]);
+}
+
#if CONFIG_LIBUKALLOC_IFSTATS
static ssize_t pool_availmem(struct uk_alloc *a)
{
--
2.20.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |