]> Git Repo - linux.git/commitdiff
xen: fix dom0 boot on huge systems
authorJuergen Gross <[email protected]>
Thu, 7 Mar 2019 09:11:19 +0000 (10:11 +0100)
committerJuergen Gross <[email protected]>
Fri, 8 Mar 2019 17:07:30 +0000 (18:07 +0100)
Commit f7c90c2aa40048 ("x86/xen: don't write ptes directly in 32-bit
PV guests") introduced a regression for booting dom0 on huge systems
with lots of RAM (in the TB range).

Reason is that on those hosts the p2m list needs to be moved early in
the boot process and this requires temporary page tables to be created.
Said commit modified xen_set_pte_init() to use a hypercall for writing
a PTE, but this requires the page table being in the direct mapped
area, which is not the case for the temporary page tables used in
xen_relocate_p2m().

As the page tables are completely written before being linked to the
actual address space instead of set_pte() a plain write to memory can
be used in xen_relocate_p2m().

Fixes: f7c90c2aa40048 ("x86/xen: don't write ptes directly in 32-bit PV guests")
Cc: [email protected]
Signed-off-by: Juergen Gross <[email protected]>
Reviewed-by: Jan Beulich <[email protected]>
Signed-off-by: Juergen Gross <[email protected]>
arch/x86/xen/mmu_pv.c

index 0f4fe206dcc2015ce212b19c8865b06f854fb3b1..20701977e6c055034f4904c8d64d241ec8675b9e 100644 (file)
@@ -2114,10 +2114,10 @@ void __init xen_relocate_p2m(void)
                                pt = early_memremap(pt_phys, PAGE_SIZE);
                                clear_page(pt);
                                for (idx_pte = 0;
-                                               idx_pte < min(n_pte, PTRS_PER_PTE);
-                                               idx_pte++) {
-                                       set_pte(pt + idx_pte,
-                                                       pfn_pte(p2m_pfn, PAGE_KERNEL));
+                                    idx_pte < min(n_pte, PTRS_PER_PTE);
+                                    idx_pte++) {
+                                       pt[idx_pte] = pfn_pte(p2m_pfn,
+                                                             PAGE_KERNEL);
                                        p2m_pfn++;
                                }
                                n_pte -= PTRS_PER_PTE;
@@ -2125,8 +2125,7 @@ void __init xen_relocate_p2m(void)
                                make_lowmem_page_readonly(__va(pt_phys));
                                pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE,
                                                PFN_DOWN(pt_phys));
-                               set_pmd(pmd + idx_pt,
-                                               __pmd(_PAGE_TABLE | pt_phys));
+                               pmd[idx_pt] = __pmd(_PAGE_TABLE | pt_phys);
                                pt_phys += PAGE_SIZE;
                        }
                        n_pt -= PTRS_PER_PMD;
@@ -2134,7 +2133,7 @@ void __init xen_relocate_p2m(void)
                        make_lowmem_page_readonly(__va(pmd_phys));
                        pin_pagetable_pfn(MMUEXT_PIN_L2_TABLE,
                                        PFN_DOWN(pmd_phys));
-                       set_pud(pud + idx_pmd, __pud(_PAGE_TABLE | pmd_phys));
+                       pud[idx_pmd] = __pud(_PAGE_TABLE | pmd_phys);
                        pmd_phys += PAGE_SIZE;
                }
                n_pmd -= PTRS_PER_PUD;
This page took 0.062861 seconds and 4 git commands to generate.