|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 2/5] plat/xen: Xen Balloon Driver
From: Cason Schindler <cason.j.schindler@xxxxxxxxx>
Add balloon driver to interface with Xen hypervisor using hypercalls.
Implement inflate and deflate API calls.
Signed-off-by: Jack Raney <raney.jack99@xxxxxxxxx>
Signed-off-by: Cason Schindler <cason.j.schindler@xxxxxxxxx>
---
plat/xen/memory.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/plat/xen/memory.c b/plat/xen/memory.c
index 8e7a7dd..fdb8aff 100644
--- a/plat/xen/memory.c
+++ b/plat/xen/memory.c
@@ -40,11 +40,15 @@
#if (defined __X86_32__) || (defined __X86_64__)
#include <xen-x86/setup.h>
#include <xen-x86/mm_pv.h>
+#include <xen-x86/mm.h>
#elif (defined __ARM_32__) || (defined __ARM_64__)
#include <xen-arm/setup.h>
#include <xen-arm/mm.h>
#endif
+#include <xen/memory.h>
+#include <common/hypervisor.h>
+
#include <uk/assert.h>
int ukplat_memregion_count(void)
@@ -163,3 +167,77 @@ void ukplat_stack_set_current_thread(void *thread_addr)
extern char irqstack[];
*((unsigned long *) irqstack) = (unsigned long) thread_addr;
}
+
+/**
+ * set up and call Xen hypercall to ask for memory back from Xen
+*/
+int xenmem_reservation_increase(int count, xen_pfn_t *frames, int order)
+{
+ struct xen_memory_reservation res = {
+#if __XEN_INTERFACE_VERSION__ >= 0x00030209
+ .memflags = 0;
+#else
+ .address_bits = 0,
+#endif
+ .extent_order = order,
+ .domid = DOMID_SELF
+ };
+
+ set_xen_guest_handle(res.extent_start, frames);
+ res.nr_extents = count;
+
+ /* Needs physical frame number */
+ int r = HYPERVISOR_memory_op(XENMEM_populate_physmap, &res);
+ return r;
+}
+
+/**
+ * set up and call Xen hypercall to give memory to Xen
+*/
+int xenmem_reservation_decrease(int count, xen_pfn_t *frames, int order)
+{
+ struct xen_memory_reservation res = {
+#if __XEN_INTERFACE_VERSION__ >= 0x00030209
+ .mem_flags = 0,
+#else
+ .address_bits = 0,
+#endif
+ .extent_order = order,
+ .domid = DOMID_SELF
+ };
+
+ set_xen_guest_handle(res.extent_start, frames);
+ res.nr_extents = count;
+
+ /* Needs guest frame number */
+ int r = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &res);
+ return r;
+}
+
+/**
+ * When we inflate we will be decreasing the memory available to the VM
+ * We will give the extent of extent order = order starting at va to the host.
+*/
+int ukplat_inflate(void* va, int order)
+{
+
+ xen_pfn_t pfn = virt_to_pfn(va);
+ int r = xenmem_reservation_decrease(1, &pfn, order);
+
+ return r;
+}
+
+/**
+ * When we deflate we will be increasing the memory available to the VM
+ * We will ask for 1 extent of extent order = order back from the host. It
will map
+ * The extent to the address va.
+*/
+int ukplat_deflate(void* va, int order)
+{
+ /* Make sure we are sending the correct frame number. Should be a GFN */
+ //xen_pfn_t pfn = virt_to_pfn(va);
+ int r = xenmem_reservation_increase(1, &va, order);
+
+ return r;
+}
+
--
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 |