We don't need extra virtual address space for ESPFIX, so it stays within
one PUD page table for both 4- and 5-level paging.

Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
---
 arch/x86/kernel/espfix_64.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/espfix_64.c b/arch/x86/kernel/espfix_64.c
index 04f89caef9c4..8e598a1ad986 100644
--- a/arch/x86/kernel/espfix_64.c
+++ b/arch/x86/kernel/espfix_64.c
@@ -50,11 +50,11 @@
 #define ESPFIX_STACKS_PER_PAGE (PAGE_SIZE/ESPFIX_STACK_SIZE)
 
 /* There is address space for how many espfix pages? */
-#define ESPFIX_PAGE_SPACE      (1UL << (PGDIR_SHIFT-PAGE_SHIFT-16))
+#define ESPFIX_PAGE_SPACE      (1UL << (P4D_SHIFT-PAGE_SHIFT-16))
 
 #define ESPFIX_MAX_CPUS                (ESPFIX_STACKS_PER_PAGE * 
ESPFIX_PAGE_SPACE)
 #if CONFIG_NR_CPUS > ESPFIX_MAX_CPUS
-# error "Need more than one PGD for the ESPFIX hack"
+# error "Need more virtual address space for the ESPFIX hack"
 #endif
 
 #define PGALLOC_GFP (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
@@ -121,11 +121,13 @@ static void init_espfix_random(void)
 
 void __init init_espfix_bsp(void)
 {
-       pgd_t *pgd_p;
+       pgd_t *pgd;
+       p4d_t *p4d;
 
        /* Install the espfix pud into the kernel page directory */
-       pgd_p = &init_level4_pgt[pgd_index(ESPFIX_BASE_ADDR)];
-       pgd_populate(&init_mm, pgd_p, (pud_t *)espfix_pud_page);
+       pgd = &init_level4_pgt[pgd_index(ESPFIX_BASE_ADDR)];
+       p4d = p4d_alloc(&init_mm, pgd, ESPFIX_BASE_ADDR);
+       p4d_populate(&init_mm, p4d, espfix_pud_page);
 
        /* Randomize the locations */
        init_espfix_random();
-- 
2.11.0

Reply via email to