|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 5/5] lib/ukallocbbuddy: Allocator Ballooning Use
From: Cason Schindler <cason.j.schindler@xxxxxxxxx>
Modify ukallocbbuddy to use memory ballooning API.
Signed-off-by: Jack Raney <raney.jack99@xxxxxxxxx>
Signed-off-by: Cason Schindler <cason.j.schindler@xxxxxxxxx>
---
lib/ukallocbbuddy/bbuddy.c | 104 ++++++++++++++++++++-
lib/ukallocbbuddy/include/uk/allocbbuddy.h | 2 +
2 files changed, 104 insertions(+), 2 deletions(-)
diff --git a/lib/ukallocbbuddy/bbuddy.c b/lib/ukallocbbuddy/bbuddy.c
index 7de3b84..4a3641e 100644
--- a/lib/ukallocbbuddy/bbuddy.c
+++ b/lib/ukallocbbuddy/bbuddy.c
@@ -48,6 +48,10 @@
#include <uk/assert.h>
#include <uk/page.h>
+#include <uk/plat/memory.h>
+
+int using_balloon = 0;
+
typedef struct chunk_head_st chunk_head_t;
typedef struct chunk_tail_st chunk_tail_t;
@@ -224,6 +228,40 @@ static ssize_t bbuddy_availmem(struct uk_alloc *a)
}
#endif
+/*********************
+ * BALLOON SUPPORT
+ */
+
+/**
+ * Initializes the balloon once it is ready. Immediate for Xen,
+ * but later for KVM driver
+*/
+void balloon_init(struct uk_alloc *a)
+{
+ struct uk_bbpalloc *b;
+ size_t i;
+ int order;
+ chunk_head_t *chunk;
+ b = (struct uk_bbpalloc *)&a->priv;
+ if (using_balloon != 0) {
+ return;
+ }
+
+ for (i = 0; i < FREELIST_SIZE; i++) {
+ if (!FREELIST_EMPTY(b->free_head[i])) {
+ chunk = b->free_head[i];
+ order = chunk->level;
+ int r = ukplat_inflate((void*)chunk, order );
+ if (r < 0) {
+ /* The balloon is ready but failed for another
reason. */
+ return;
+ }
+ }
+
+ }
+ using_balloon = 1;
+}
+
/*********************
* BINARY BUDDY PAGE ALLOCATOR
*/
@@ -271,6 +309,24 @@ static void *bbuddy_palloc(struct uk_alloc *a, size_t
order)
}
map_alloc(b, (uintptr_t)alloc_ch, 1UL << order);
+ /* Remove the chunk from the balloon */
+ int r = ukplat_deflate((void*)alloc_ch, (int)order);
+ if (r < 0) {
+ if (r == -ENXIO) {
+ /* The balloon isnt ready yet! We don't need to do
anything */
+ } else if (r == -ENOSYS) {
+ /* deflation not implemented */
+ } else {
+ /* The balloon is ready but failed for another reason.
*/
+ return r;
+ }
+ } else if (using_balloon == 0) {
+ /* Deflate succeeded for the first time. The balloon driver is
now ready!
+ * We need to move all of the freelist data to the balloon
+ */
+ balloon_init(a);
+ }
+
return ((void *)alloc_ch);
no_memory:
@@ -296,6 +352,25 @@ static void bbuddy_pfree(struct uk_alloc *a, void *obj,
size_t order)
/* First free the chunk */
map_free(b, (uintptr_t)obj, 1UL << order);
+ /* Add the free chunk to the balloon */
+ int r = ukplat_inflate((void*)obj, (int)order);
+ if (r < 0) {
+ if (r == -ENXIO) {
+ /* The balloon isnt ready yet! We don't need to do
anything */
+ } else if (r == -ENOSYS) {
+ /* inflateion not implemented */
+ } else {
+ /* The balloon is ready but failed for another reason.
*/
+ return r;
+ }
+
+ } else if (using_balloon == 0) {
+ /* Inflate succeeded for the first time. The balloon driver is
now ready!
+ * We need to move all of the free list data to the balloon
+ */
+ balloon_init(a);
+ }
+
/* Create free chunk */
freed_ch = (chunk_head_t *)obj;
freed_ct = (chunk_tail_t *)((char *)obj
@@ -409,8 +484,8 @@ static int bbuddy_addmem(struct uk_alloc *a, void *base,
size_t len)
memset(memr->mm_alloc_bitmap, (unsigned char) ~0,
memr->mm_alloc_bitmap_size);
- /* free up the memory we've been given to play with */
- map_free(b, min, memr->nr_pages);
+
+ /* Do not call map_free; instead inflate: */
count = 0;
while (range != 0) {
@@ -426,6 +501,31 @@ static int bbuddy_addmem(struct uk_alloc *a, void *base,
size_t len)
(uintptr_t)a, min, (uintptr_t)(min + (1UL << i)),
(i - __PAGE_SHIFT));
+ /*
+ * For each free block we should attempt to add it to the
balloon!
+ * Afterwards, if successful, all of our usable memory will be
in the balloon.
+ * It will become accessible by calling deflate in ukpalloc!
+ *
+ * If the balloon device has not yet been added then the
allocator will proceed
+ * without ballooning suport until the device has been added
(KVM)
+ */
+ int r = ukplat_inflate((void*)min, (int)(i - __PAGE_SHIFT));
+ if (r < 0) {
+ if (r == -ENXIO) {
+ /* The balloon isnt ready yet! We don't need to
do anything */
+ } else if (r == -ENOSYS) {
+ /* inflation not implemented */
+ } else {
+ /* The balloon is ready but failed for another
reason. */
+ return r;
+ }
+ } else if (using_balloon == 0) {
+ /* Inflate succeeded for the first time. The balloon
driver is now ready!
+ * We need to move all of the free list data to the
balloon
+ */
+ balloon_init(a);
+ }
+
ch = (chunk_head_t *)min;
min += 1UL << i;
range -= 1UL << i;
diff --git a/lib/ukallocbbuddy/include/uk/allocbbuddy.h
b/lib/ukallocbbuddy/include/uk/allocbbuddy.h
index d7afef4..a3371c8 100644
--- a/lib/ukallocbbuddy/include/uk/allocbbuddy.h
+++ b/lib/ukallocbbuddy/include/uk/allocbbuddy.h
@@ -42,6 +42,8 @@
extern "C" {
#endif
+void balloon_init(struct uk_alloc *a);
+
struct uk_alloc *uk_allocbbuddy_init(void *base, size_t len);
#ifdef __cplusplus
--
2.24.0
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |