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

[xen stable-4.18] x86: allow non-BIGMEM configs to boot on >= 16Tb systems



commit 96b9bb0afdd66354f5fbc057e43036e4afe961d7
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Tue May 13 14:00:00 2025 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue May 13 14:00:00 2025 +0200

    x86: allow non-BIGMEM configs to boot on >= 16Tb systems
    
    While frame table setup, directmap init, and boot allocator population
    respect all intended bounds, the logic passing memory to the heap
    allocator which wasn't passed to the boot allocator fails to respect
    max_{pdx,pfn}. This then typically triggers the BUG() in
    free_heap_pages() after checking page state, because of hitting a struct
    page_info instance which was set to all ~0.
    
    Of course all the memory above the 16Tb boundary is still going to
    remain unused; using it requires BIGMEM=y. And of course this fix
    similarly ought to help BIGMEM=y configurations on >= 123Tb systems
    (where all the memory beyond that boundary continues to be unused).
    
    Fixes: bac2000063ba ("x86-64: reduce range spanned by 1:1 mapping and frame 
table indexes")
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
    master commit: 64d32b75e6e3b093828623d5ce30b4826bb6b1df
    master date: 2023-12-19 13:47:38 +0100
---
 xen/arch/x86/setup.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 98d18f237a..8a79fc1d8c 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -1713,15 +1713,15 @@ void __init noreturn __start_xen(unsigned long mbi_p)
 
     if ( max_page - 1 > virt_to_mfn(HYPERVISOR_VIRT_END - 1) )
     {
-        unsigned long limit = virt_to_mfn(HYPERVISOR_VIRT_END - 1);
+        unsigned long lo = virt_to_mfn(HYPERVISOR_VIRT_END - 1);
         uint64_t mask = PAGE_SIZE - 1;
 
         if ( !highmem_start )
-            xenheap_max_mfn(limit);
+            xenheap_max_mfn(lo);
 
         end_boot_allocator();
 
-        /* Pass the remaining memory to the allocator. */
+        /* Pass the remaining memory in (lo, max_page) to the allocator. */
         for ( i = 0; i < boot_e820.nr_map; i++ )
         {
             uint64_t s, e;
@@ -1730,10 +1730,12 @@ void __init noreturn __start_xen(unsigned long mbi_p)
                 continue;
             s = (boot_e820.map[i].addr + mask) & ~mask;
             e = (boot_e820.map[i].addr + boot_e820.map[i].size) & ~mask;
-            if ( PFN_DOWN(e) <= limit )
+            if ( PFN_DOWN(e) <= lo || PFN_DOWN(s) >= max_page )
                 continue;
-            if ( PFN_DOWN(s) <= limit )
-                s = pfn_to_paddr(limit + 1);
+            if ( PFN_DOWN(s) <= lo )
+                s = pfn_to_paddr(lo + 1);
+            if ( PFN_DOWN(e) > max_page )
+                e = pfn_to_paddr(max_page);
             init_domheap_pages(s, e);
         }
     }
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.18



 


Rackspace

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