[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH 17/22] plat/kvm: arm64: Calculate pagetable size dynamically by image size


  • To: <minios-devel@xxxxxxxxxxxxxxxxxxxx>, <simon.kuenzer@xxxxxxxxx>
  • From: Wei Chen <wei.chen@xxxxxxx>
  • Date: Thu, 8 Nov 2018 09:51:48 +0000
  • Authentication-results: spf=pass (sender IP is 40.67.248.234) smtp.mailfrom=arm.com; lists.xenproject.org; dkim=none (message not signed) header.d=none;lists.xenproject.org; dmarc=bestguesspass action=none header.from=arm.com;
  • Cc: Kaly.Xin@xxxxxxx, nd@xxxxxxx, wei.chen@xxxxxxx
  • Delivery-date: Thu, 08 Nov 2018 09:53:23 +0000
  • List-id: Mini-os development list <minios-devel.lists.xenproject.org>
  • Nodisclaimer: True
  • Spamdiagnosticmetadata: NSPM
  • Spamdiagnosticoutput: 1:99

The previous L3 page table size is a fixed value based on the
assumption that, image size will not exceed 2MB. But that's not
true, some applications like node.js will be about 40MB after
converting to Unikernel. So in this patch, we calculate the
page table size by real image size. In order to mapping the
image occupied memory to L3 page table, we round up the image
size with 2MB.

Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
---
 plat/kvm/arm/entry64.S              | 33 +++++++++++++++++++++++++++--
 plat/kvm/arm/pagetable64.S          |  7 ++++--
 plat/kvm/arm/setup.c                |  2 +-
 plat/kvm/include/kvm-arm/arm64/mm.h | 14 ++++++------
 4 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/plat/kvm/arm/entry64.S b/plat/kvm/arm/entry64.S
index c1af0a4..72e170f 100644
--- a/plat/kvm/arm/entry64.S
+++ b/plat/kvm/arm/entry64.S
@@ -36,6 +36,11 @@
 #include <kvm-arm/mm.h>
 #include <arm/cpu_defs.h>
 
+.global page_table_size
+.data
+page_table_size:
+    .dword 0x0
+
 /*
  * The registers used by _libkvmplat_start:
  * x0 - FDT pointer
@@ -60,9 +65,29 @@ ENTRY(_libkvmplat_entry)
        msr sctlr_el1, x2
        isb
 
-       /* Boot stack is placed after pagetable area temporarily */
+       /* Caculate the image size */
        ldr x26, =_end
-       add x26, x26, #PAGE_TABLE_SIZE
+       ldr x15, =_dtb
+       sub x15, x26, x15
+
+       /* Round up the size to 2MB */
+       mov x17, #0xfffff
+       add x15, x15, x17
+       and x15, x15, #0xfffffffffff00000
+
+       /*
+        * How many bytes would be used for L3_TABLE
+        * ((x15 >> 21) << 12)
+        */
+       lsr x17, x15, #9
+
+       /* Total bytes for pagetable */
+       add x17, x17, #L0_TABLE_SIZE
+       add x17, x17, #L1_TABLE_SIZE
+       add x17, x17, #L2_TABLE_SIZE
+
+       /* Boot stack is placed after pagetable area temporarily */
+       add x26, x26, x17
        add x27, x26, #__STACK_SIZE
 
        /*
@@ -84,6 +109,10 @@ ENTRY(_libkvmplat_entry)
        /* Set the context id */
        msr contextidr_el1, xzr
 
+       /* Save page table size for later usage */
+       ldr x26, =page_table_size
+       str x17, [x26]
+
        /* Create a pagetable to do PA == VA mapping */
        bl create_pagetables
 
diff --git a/plat/kvm/arm/pagetable64.S b/plat/kvm/arm/pagetable64.S
index cf30584..7d19f6b 100644
--- a/plat/kvm/arm/pagetable64.S
+++ b/plat/kvm/arm/pagetable64.S
@@ -72,7 +72,8 @@ ENTRY(create_pagetables)
 
        /* Clean the page table */
        mov x6, x14
-       add x13, x14, #PAGE_TABLE_SIZE
+       ldr x13, =page_table_size
+       ldr x13, [x13]
 1:
        stp  xzr, xzr, [x6], #16
        stp  xzr, xzr, [x6], #16
@@ -244,7 +245,9 @@ ENTRY(start_mmu)
         */
        ldr x0, =_data
        ldr x1, =_end
-       add x1, x1, #PAGE_TABLE_SIZE
+       ldr x2, =page_table_size
+       ldr x2, [x2]
+       add x1, x2, x1
        add x1, x1, #__STACK_SIZE
        sub x1, x1, x0
        bl clean_and_invalidate_dcache_range
diff --git a/plat/kvm/arm/setup.c b/plat/kvm/arm/setup.c
index 59faaa2..bfbb627 100644
--- a/plat/kvm/arm/setup.c
+++ b/plat/kvm/arm/setup.c
@@ -147,7 +147,7 @@ static void _init_dtb_mem(void)
 
        max_addr = mem_base + mem_size;
        _libkvmplat_pagetable =(void *) ALIGN_DOWN((size_t)&_end, __PAGE_SIZE);
-       _libkvmplat_heap_start = _libkvmplat_pagetable + PAGE_TABLE_SIZE;
+       _libkvmplat_heap_start = _libkvmplat_pagetable + page_table_size;
        _libkvmplat_mem_end = (void *) max_addr;
 
        /* AArch64 require stack be 16-bytes alignment by default */
diff --git a/plat/kvm/include/kvm-arm/arm64/mm.h 
b/plat/kvm/include/kvm-arm/arm64/mm.h
index 23bc658..9ec1273 100644
--- a/plat/kvm/include/kvm-arm/arm64/mm.h
+++ b/plat/kvm/include/kvm-arm/arm64/mm.h
@@ -69,15 +69,17 @@
 #define L2_TABLE_SIZE   __PAGE_SIZE
 
 /*
- * As Unikraft image's size is very tiny, from tens to hundreds kilo
- * bytes. So one page for L3_TABLE is enough for us to manage section
- * attributes of image.
+ * We will use Unikraft image's size to caculate the L3_TABLE_SIZE.
+ * Because we allocate one page for L2 TABLE, fo the max image size
+ * would be 1GB. It would be enough for current stage.
  */
 #define L3_TABLE_OFFSET (L2_TABLE_OFFSET + L2_TABLE_SIZE)
-#define L3_TABLE_SIZE   __PAGE_SIZE
+
+#ifndef __ASSEMBLY__
 
 /* Total memory size that will be used by pagetable */
-#define PAGE_TABLE_SIZE (L0_TABLE_SIZE + L1_TABLE_SIZE + \
-                               L2_TABLE_SIZE + L3_TABLE_SIZE)
+extern uint64_t page_table_size;
+
+#endif /*__ASSEMBLY__ */
 
 #endif /* __KVM_ARM_64_MM_H__ */
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.