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

[Xen-changelog] [xen staging] xen/page_alloc: Keep away MFN 0 from the buddy allocator



commit 762b9a2d990bba1f3aefe660cff0c37ad2e375bc
Author:     Julien Grall <julien.grall@xxxxxxx>
AuthorDate: Fri Aug 9 13:14:40 2019 +0100
Commit:     Stefano Stabellini <sstabellini@xxxxxxxxxx>
CommitDate: Fri Aug 9 11:12:55 2019 -0700

    xen/page_alloc: Keep away MFN 0 from the buddy allocator
    
    Combining of buddies happens only such that the resulting larger buddy
    is still order-aligned. To cross a zone boundary while merging, the
    implication is that both the buddy [0, 2^n-1] and the buddy
    [2^n, 2^(n+1)-1] are free.
    
    Ideally we want to fix the allocator, but for now we can just prevent
    adding the MFN 0 in the allocator to avoid merging across zone
    boundaries.
    
    On x86, the MFN 0 is already kept away from the buddy allocator. So the
    bug can only happen on Arm platform where the first memory bank is
    starting at 0.
    
    As this is a specific to the allocator, the MFN 0 is removed in the common 
code
    to cater all the architectures (current and future).
    
    [Stefano: improve commit message]
    
    Reported-by: Jeff Kubascik <jeff.kubascik@xxxxxxxxxxxxxxx>
    Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
    Tested-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
    Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
 xen/common/page_alloc.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index b29c070c3d..438e45ae75 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -1771,6 +1771,18 @@ static void init_heap_pages(
     bool idle_scrub = false;
 
     /*
+     * Keep MFN 0 away from the buddy allocator to avoid crossing zone
+     * boundary when merging two buddies.
+     */
+    if ( !mfn_x(page_to_mfn(pg)) )
+    {
+        if ( nr_pages-- <= 1 )
+            return;
+        pg++;
+    }
+
+
+    /*
      * Some pages may not go through the boot allocator (e.g reserved
      * memory at boot but released just after --- kernel, initramfs,
      * etc.).
--
generated by git-patchbot for /home/xen/git/xen.git#staging

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

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