[xen master] ARM: new VGIC: Allocate two pages for struct vcpu

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view

[xen master] ARM: new VGIC: Allocate two pages for struct vcpu

commit b77d774d8274183c2252f5fbc9fa3b3b7022ba06
Author:     Andre Przywara <[hidden email]>
AuthorDate: Thu Dec 21 12:41:28 2017 +0000
Commit:     Stefano Stabellini <[hidden email]>
CommitDate: Thu Mar 29 10:37:25 2018 -0700

    ARM: new VGIC: Allocate two pages for struct vcpu
    At the moment we allocate exactly one page for struct vcpu on ARM, also
    have a check in place to prevent it growing beyond 4KB.
    As the struct includes the state of all 32 private (per-VCPU) interrupts,
    we are at 3840 bytes on arm64 at the moment already. Growing the per-IRQ
    VGIC structure even slightly makes the VCPU quickly exceed the 4K limit.
    The new VGIC will need more space per virtual IRQ. I spent a few hours
    trying to trim this down, but couldn't get it below 4KB, even with the
    nasty hacks piling up to save some bytes here and there.
    It turns out that beyond efficiency, maybe, there is no real technical
    reason this struct has to fit in one page, so lifting the limit to two
    pages seems like the most pragmatic solution.
    Restrict the compilation error to compiling with the new VGIC and for
    ARM64 only.
    Signed-off-by: Andre Przywara <[hidden email]>
    Acked-by: Julien Grall <[hidden email]>
    Acked-by: Stefano Stabellini <[hidden email]>
 xen/arch/arm/domain.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 9688e62f78..4a0161dcd0 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -505,19 +505,36 @@ void dump_pageframe_info(struct domain *d)
+ * The new VGIC has a bigger per-IRQ structure, so we need more than one
+ * page on ARM64. Cowardly increase the limit in this case.
+ */
+#if defined(CONFIG_NEW_VGIC) && defined(CONFIG_ARM_64)
+#define MAX_PAGES_PER_VCPU  2
+#define MAX_PAGES_PER_VCPU  1
 struct vcpu *alloc_vcpu_struct(void)
     struct vcpu *v;
-    BUILD_BUG_ON(sizeof(*v) > PAGE_SIZE);
-    v = alloc_xenheap_pages(0, 0);
+    v = alloc_xenheap_pages(get_order_from_bytes(sizeof(*v)), 0);
     if ( v != NULL )
-        clear_page(v);
+    {
+        unsigned int i;
+        for ( i = 0; i < DIV_ROUND_UP(sizeof(*v), PAGE_SIZE); i++ )
+            clear_page((void *)v + i * PAGE_SIZE);
+    }
     return v;
 void free_vcpu_struct(struct vcpu *v)
-    free_xenheap_page(v);
+    free_xenheap_pages(v, get_order_from_bytes(sizeof(*v)));
 int vcpu_initialise(struct vcpu *v)
generated by git-patchbot for /home/xen/git/xen.git#master

Xen-changelog mailing list
[hidden email]