]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
x86/xen: enable early use of set_fixmap in 32-bit Xen PV guest
authorJuergen Gross <jgross@suse.com>
Mon, 20 Aug 2018 15:24:20 +0000 (17:24 +0200)
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>
Mon, 20 Aug 2018 18:46:26 +0000 (14:46 -0400)
Commit 7b25b9cb0dad83 ("x86/xen/time: Initialize pv xen time in
init_hypervisor_platform()") moved the mapping of the shared info area
before pagetable_init(). This breaks booting as 32-bit PV guest as the
use of set_fixmap isn't possible at this time on 32-bit.

This can be worked around by populating the needed PMD on 32-bit
kernel earlier.

In order not to reimplement populate_extra_pte() using extend_brk()
for allocating new page tables extend alloc_low_pages() to do that in
case the early page table pool is not yet available.

Fixes: 7b25b9cb0dad83 ("x86/xen/time: Initialize pv xen time in init_hypervisor_platform()")
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
arch/x86/mm/init.c
arch/x86/xen/enlighten_pv.c
arch/x86/xen/mmu_pv.c

index acfab322fbe062c24dee168f6b79e25e38290c68..5c32a766549215c3032dfceade9bbde7b8b56a89 100644 (file)
@@ -99,15 +99,22 @@ __ref void *alloc_low_pages(unsigned int num)
        }
 
        if ((pgt_buf_end + num) > pgt_buf_top || !can_use_brk_pgt) {
-               unsigned long ret;
-               if (min_pfn_mapped >= max_pfn_mapped)
-                       panic("alloc_low_pages: ran out of memory");
-               ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT,
+               unsigned long ret = 0;
+
+               if (min_pfn_mapped < max_pfn_mapped) {
+                       ret = memblock_find_in_range(
+                                       min_pfn_mapped << PAGE_SHIFT,
                                        max_pfn_mapped << PAGE_SHIFT,
                                        PAGE_SIZE * num , PAGE_SIZE);
+               }
+               if (ret)
+                       memblock_reserve(ret, PAGE_SIZE * num);
+               else if (can_use_brk_pgt)
+                       ret = __pa(extend_brk(PAGE_SIZE * num, PAGE_SIZE));
+
                if (!ret)
                        panic("alloc_low_pages: can not alloc memory");
-               memblock_reserve(ret, PAGE_SIZE * num);
+
                pfn = ret >> PAGE_SHIFT;
        } else {
                pfn = pgt_buf_end;
index a26a11d8d0eb13f19de41ba9a3b9657c750075a5..52a7c3faee0ccf88f840110093111e22bc7b30ad 100644 (file)
@@ -122,6 +122,8 @@ static void __init xen_banner(void)
 
 static void __init xen_pv_init_platform(void)
 {
+       populate_extra_pte(fix_to_virt(FIX_PARAVIRT_BOOTMAP));
+
        set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info);
        HYPERVISOR_shared_info = (void *)fix_to_virt(FIX_PARAVIRT_BOOTMAP);
 
index 52206ad81e4bcabe5d1173781397fdfa7c6d2b3a..9e7012858420c99174002ae47a2d79e81aaad8df 100644 (file)
@@ -2171,6 +2171,8 @@ void __init xen_relocate_p2m(void)
 #else  /* !CONFIG_X86_64 */
 static RESERVE_BRK_ARRAY(pmd_t, initial_kernel_pmd, PTRS_PER_PMD);
 static RESERVE_BRK_ARRAY(pmd_t, swapper_kernel_pmd, PTRS_PER_PMD);
+RESERVE_BRK(fixup_kernel_pmd, PAGE_SIZE);
+RESERVE_BRK(fixup_kernel_pte, PAGE_SIZE);
 
 static void __init xen_write_cr3_init(unsigned long cr3)
 {