* [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP
@ 2023-05-15 8:19 Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 1/4] x86/vsyscall: Don't use set_fixmap() to map vsyscall page Hou Wenlong
` (6 more replies)
0 siblings, 7 replies; 10+ messages in thread
From: Hou Wenlong @ 2023-05-15 8:19 UTC (permalink / raw)
To: linux-kernel
Cc: Lai Jiangshan, Hou Wenlong, Alexey Makhalov, Andrew Morton,
Andy Lutomirski, Anshuman Khandual, Borislav Petkov,
Boris Ostrovsky, Brian Gerst, Dave Hansen, David Woodhouse,
H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Juergen Gross,
Kirill A. Shutemov, Mike Rapoport (IBM), Pasha Tatashin,
Peter Zijlstra, Srivatsa S. Bhat (VMware), Suren Baghdasaryan,
Thomas Gleixner, Usama Arif, virtualization,
VMware PV-Drivers Reviewers, x86, xen-devel
This patchset unifies FIXADDR_TOP as a variable for x86, allowing the
fixmap area to be movable and relocated with the kernel image in the
x86/PIE patchset [0]. This enables the kernel image to be relocated in
the top 512G of the address space.
[0] https://lore.kernel.org/lkml/cover.1682673542.git.houwenlong.hwl@antgroup.com
Hou Wenlong (4):
x86/vsyscall: Don't use set_fixmap() to map vsyscall page
x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap
area
x86/fixmap: Move vsyscall page out of fixmap area
x86/fixmap: Unify FIXADDR_TOP
arch/x86/entry/vsyscall/vsyscall_64.c | 7 +-----
arch/x86/include/asm/fixmap.h | 28 ++++-------------------
arch/x86/include/asm/paravirt.h | 7 ++++++
arch/x86/include/asm/paravirt_types.h | 4 ++++
arch/x86/include/asm/vsyscall.h | 13 +++++++++++
arch/x86/kernel/head64.c | 1 -
arch/x86/kernel/head_64.S | 6 ++---
arch/x86/kernel/paravirt.c | 4 ++++
arch/x86/mm/dump_pagetables.c | 3 ++-
arch/x86/mm/fault.c | 1 -
arch/x86/mm/init_64.c | 2 +-
arch/x86/mm/ioremap.c | 5 ++---
arch/x86/mm/pgtable.c | 13 +++++++++++
arch/x86/mm/pgtable_32.c | 3 ---
arch/x86/xen/mmu_pv.c | 32 +++++++++++++++++++--------
15 files changed, 77 insertions(+), 52 deletions(-)
base-commit: f585d5177e1aad174fd6da0e3936b682ed58ced0
--
2.31.1
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH RFC 1/4] x86/vsyscall: Don't use set_fixmap() to map vsyscall page
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
@ 2023-05-15 8:19 ` Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 2/4] x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap area Hou Wenlong
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Hou Wenlong @ 2023-05-15 8:19 UTC (permalink / raw)
To: linux-kernel
Cc: Lai Jiangshan, Hou Wenlong, Andy Lutomirski, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
Juergen Gross, Srivatsa S. Bhat (VMware), Alexey Makhalov,
VMware PV-Drivers Reviewers, Boris Ostrovsky, Suren Baghdasaryan,
Andrew Morton, Mike Rapoport (IBM), Kirill A. Shutemov,
virtualization, xen-devel
In order to unify FIXADDR_TOP for x86 and allow the fixmap area to be
movable, the vsyscall page should be mapped individually. However, for
XENPV guests, the vsyscall page needs to be mapped into the user
pagetable as well. Therefore, a new PVMMU operation is introduced to
assist in mapping the vsyscall page.
Suggested-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
---
arch/x86/entry/vsyscall/vsyscall_64.c | 3 +--
arch/x86/include/asm/paravirt.h | 7 +++++++
arch/x86/include/asm/paravirt_types.h | 4 ++++
arch/x86/include/asm/vsyscall.h | 13 +++++++++++++
arch/x86/kernel/paravirt.c | 4 ++++
arch/x86/xen/mmu_pv.c | 20 ++++++++++++++------
6 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c
index e0ca8120aea8..4373460ebbde 100644
--- a/arch/x86/entry/vsyscall/vsyscall_64.c
+++ b/arch/x86/entry/vsyscall/vsyscall_64.c
@@ -385,8 +385,7 @@ void __init map_vsyscall(void)
* page.
*/
if (vsyscall_mode == EMULATE) {
- __set_fixmap(VSYSCALL_PAGE, physaddr_vsyscall,
- PAGE_KERNEL_VVAR);
+ __set_vsyscall_page(physaddr_vsyscall, PAGE_KERNEL_VVAR);
set_vsyscall_pgtable_user_bits(swapper_pg_dir);
}
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index b49778664d2b..c9543d383df0 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -576,6 +576,13 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
{
pv_ops.mmu.set_fixmap(idx, phys, flags);
}
+
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+static inline void __set_vsyscall_page(phys_addr_t phys, pgprot_t flags)
+{
+ pv_ops.mmu.set_vsyscall_page(phys, flags);
+}
+#endif
#endif
#if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS)
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 4acbcddddc29..2dc9397e064d 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -224,6 +224,10 @@ struct pv_mmu_ops {
an mfn. We can tell which is which from the index. */
void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
phys_addr_t phys, pgprot_t flags);
+
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+ void (*set_vsyscall_page)(phys_addr_t phys, pgprot_t flags);
+#endif
#endif
} __no_randomize_layout;
diff --git a/arch/x86/include/asm/vsyscall.h b/arch/x86/include/asm/vsyscall.h
index ab60a71a8dcb..73691fc60924 100644
--- a/arch/x86/include/asm/vsyscall.h
+++ b/arch/x86/include/asm/vsyscall.h
@@ -2,6 +2,7 @@
#ifndef _ASM_X86_VSYSCALL_H
#define _ASM_X86_VSYSCALL_H
+#include <asm/pgtable.h>
#include <linux/seqlock.h>
#include <uapi/asm/vsyscall.h>
@@ -15,6 +16,18 @@ extern void set_vsyscall_pgtable_user_bits(pgd_t *root);
*/
extern bool emulate_vsyscall(unsigned long error_code,
struct pt_regs *regs, unsigned long address);
+static inline void native_set_vsyscall_page(phys_addr_t phys, pgprot_t flags)
+{
+ pgprot_val(flags) &= __default_kernel_pte_mask;
+ set_pte_vaddr(VSYSCALL_ADDR, pfn_pte(phys >> PAGE_SHIFT, flags));
+}
+
+#ifndef CONFIG_PARAVIRT_XXL
+#define __set_vsyscall_page native_set_vsyscall_page
+#else
+#include <asm/paravirt.h>
+#endif
+
#else
static inline void map_vsyscall(void) {}
static inline bool emulate_vsyscall(unsigned long error_code,
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index ac10b46c5832..13c81402f377 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -33,6 +33,7 @@
#include <asm/tlb.h>
#include <asm/io_bitmap.h>
#include <asm/gsseg.h>
+#include <asm/vsyscall.h>
/*
* nop stub, which must not clobber anything *including the stack* to
@@ -357,6 +358,9 @@ struct paravirt_patch_template pv_ops = {
},
.mmu.set_fixmap = native_set_fixmap,
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+ .mmu.set_vsyscall_page = native_set_vsyscall_page,
+#endif
#endif /* CONFIG_PARAVIRT_XXL */
#if defined(CONFIG_PARAVIRT_SPINLOCKS)
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index b3b8d289b9ab..c42c60faa3bb 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -59,6 +59,7 @@
#include <asm/tlbflush.h>
#include <asm/fixmap.h>
+#include <asm/vsyscall.h>
#include <asm/mmu_context.h>
#include <asm/setup.h>
#include <asm/paravirt.h>
@@ -2020,9 +2021,6 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
switch (idx) {
case FIX_BTMAP_END ... FIX_BTMAP_BEGIN:
-#ifdef CONFIG_X86_VSYSCALL_EMULATION
- case VSYSCALL_PAGE:
-#endif
/* All local page mappings */
pte = pfn_pte(phys, prot);
break;
@@ -2058,14 +2056,21 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
vaddr = __fix_to_virt(idx);
if (HYPERVISOR_update_va_mapping(vaddr, pte, UVMF_INVLPG))
BUG();
+}
#ifdef CONFIG_X86_VSYSCALL_EMULATION
+static void xen_set_vsyscall_page(phys_addr_t phys, pgprot_t prot)
+{
+ pte_t pte = pfn_pte(phys >> PAGE_SHIFT, prot);
+
+ if (HYPERVISOR_update_va_mapping(VSYSCALL_ADDR, pte, UVMF_INVLPG))
+ BUG();
+
/* Replicate changes to map the vsyscall page into the user
pagetable vsyscall mapping. */
- if (idx == VSYSCALL_PAGE)
- set_pte_vaddr_pud(level3_user_vsyscall, vaddr, pte);
-#endif
+ set_pte_vaddr_pud(level3_user_vsyscall, VSYSCALL_ADDR, pte);
}
+#endif
static void __init xen_post_allocator_init(void)
{
@@ -2156,6 +2161,9 @@ static const typeof(pv_ops) xen_mmu_ops __initconst = {
},
.set_fixmap = xen_set_fixmap,
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+ .set_vsyscall_page = xen_set_vsyscall_page,
+#endif
},
};
--
2.31.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH RFC 2/4] x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap area
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 1/4] x86/vsyscall: Don't use set_fixmap() to map vsyscall page Hou Wenlong
@ 2023-05-15 8:19 ` Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 3/4] x86/fixmap: Move vsyscall page " Hou Wenlong
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Hou Wenlong @ 2023-05-15 8:19 UTC (permalink / raw)
To: linux-kernel
Cc: Lai Jiangshan, Hou Wenlong, Juergen Gross, Boris Ostrovsky,
Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
H. Peter Anvin, xen-devel
If the vsyscall page is moved out of the fixmap area, then FIXADDR_TOP
would be below the vsyscall page. Therefore, it should be pinned up to
VSYSCALL_ADDR if vsyscall is enabled.
Suggested-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
---
arch/x86/xen/mmu_pv.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index c42c60faa3bb..c1f298c31e64 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -587,6 +587,12 @@ static void xen_p4d_walk(struct mm_struct *mm, p4d_t *p4d,
xen_pud_walk(mm, pud, func, last, limit);
}
+#ifdef CONFIG_X86_VSYSCALL_EMULATION
+#define __KERNEL_MAP_TOP (VSYSCALL_ADDR + PAGE_SIZE)
+#else
+#define __KERNEL_MAP_TOP FIXADDR_TOP
+#endif
+
/*
* (Yet another) pagetable walker. This one is intended for pinning a
* pagetable. This means that it walks a pagetable and calls the
@@ -594,7 +600,7 @@ static void xen_p4d_walk(struct mm_struct *mm, p4d_t *p4d,
* at every level. It walks the entire pagetable, but it only bothers
* pinning pte pages which are below limit. In the normal case this
* will be STACK_TOP_MAX, but at boot we need to pin up to
- * FIXADDR_TOP.
+ * __KERNEL_MAP_TOP.
*
* We must skip the Xen hole in the middle of the address space, just after
* the big x86-64 virtual hole.
@@ -609,7 +615,7 @@ static void __xen_pgd_walk(struct mm_struct *mm, pgd_t *pgd,
/* The limit is the last byte to be touched */
limit--;
- BUG_ON(limit >= FIXADDR_TOP);
+ BUG_ON(limit >= __KERNEL_MAP_TOP);
/*
* 64-bit has a great big hole in the middle of the address
@@ -797,7 +803,7 @@ static void __init xen_after_bootmem(void)
#ifdef CONFIG_X86_VSYSCALL_EMULATION
SetPagePinned(virt_to_page(level3_user_vsyscall));
#endif
- xen_pgd_walk(&init_mm, xen_mark_pinned, FIXADDR_TOP);
+ xen_pgd_walk(&init_mm, xen_mark_pinned, __KERNEL_MAP_TOP);
}
static void xen_unpin_page(struct mm_struct *mm, struct page *page,
--
2.31.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH RFC 3/4] x86/fixmap: Move vsyscall page out of fixmap area
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 1/4] x86/vsyscall: Don't use set_fixmap() to map vsyscall page Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 2/4] x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap area Hou Wenlong
@ 2023-05-15 8:19 ` Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 4/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Hou Wenlong @ 2023-05-15 8:19 UTC (permalink / raw)
To: linux-kernel
Cc: Lai Jiangshan, Hou Wenlong, Andy Lutomirski, Thomas Gleixner,
Ingo Molnar, Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
Peter Zijlstra, Suren Baghdasaryan, Andrew Morton,
Mike Rapoport (IBM), Kirill A. Shutemov, David Woodhouse,
Usama Arif, Josh Poimboeuf, Brian Gerst
After mapping vsyscall page individually, the vsyscall page could be
moved out of fixmap area.
Suggested-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
---
arch/x86/entry/vsyscall/vsyscall_64.c | 4 ----
arch/x86/include/asm/fixmap.h | 17 +++++------------
arch/x86/kernel/head_64.S | 6 +++---
arch/x86/mm/fault.c | 1 -
arch/x86/mm/init_64.c | 2 +-
5 files changed, 9 insertions(+), 21 deletions(-)
diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c
index 4373460ebbde..f469f8dc36d4 100644
--- a/arch/x86/entry/vsyscall/vsyscall_64.c
+++ b/arch/x86/entry/vsyscall/vsyscall_64.c
@@ -35,7 +35,6 @@
#include <asm/vsyscall.h>
#include <asm/unistd.h>
-#include <asm/fixmap.h>
#include <asm/traps.h>
#include <asm/paravirt.h>
@@ -391,7 +390,4 @@ void __init map_vsyscall(void)
if (vsyscall_mode == XONLY)
vm_flags_init(&gate_vma, VM_EXEC);
-
- BUILD_BUG_ON((unsigned long)__fix_to_virt(VSYSCALL_PAGE) !=
- (unsigned long)VSYSCALL_ADDR);
}
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
index d0dcefb5cc59..eeb152ad9682 100644
--- a/arch/x86/include/asm/fixmap.h
+++ b/arch/x86/include/asm/fixmap.h
@@ -23,13 +23,13 @@
* covered fully.
*/
#ifndef CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP
-# define FIXMAP_PMD_NUM 2
+# define FIXMAP_PMD_NUM 1
#else
# define KM_PMDS (KM_MAX_IDX * ((CONFIG_NR_CPUS + 511) / 512))
-# define FIXMAP_PMD_NUM (KM_PMDS + 2)
+# define FIXMAP_PMD_NUM (KM_PMDS + 1)
#endif
-/* fixmap starts downwards from the 507th entry in level2_fixmap_pgt */
-#define FIXMAP_PMD_TOP 507
+/* fixmap starts downwards from the 506th entry in level2_fixmap_pgt */
+#define FIXMAP_PMD_TOP 506
#ifndef __ASSEMBLY__
#include <linux/kernel.h>
@@ -38,8 +38,6 @@
#include <asm/pgtable_types.h>
#ifdef CONFIG_X86_32
#include <linux/threads.h>
-#else
-#include <uapi/asm/vsyscall.h>
#endif
/*
@@ -55,8 +53,7 @@
extern unsigned long __FIXADDR_TOP;
#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
#else
-#define FIXADDR_TOP (round_up(VSYSCALL_ADDR + PAGE_SIZE, 1<<PMD_SHIFT) - \
- PAGE_SIZE)
+#define FIXADDR_TOP (0xffffffffff600000UL - PAGE_SIZE)
#endif
/*
@@ -81,10 +78,6 @@ extern unsigned long __FIXADDR_TOP;
enum fixed_addresses {
#ifdef CONFIG_X86_32
FIX_HOLE,
-#else
-#ifdef CONFIG_X86_VSYSCALL_EMULATION
- VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT,
-#endif
#endif
FIX_DBGP_BASE,
FIX_EARLYCON_MEM_BASE,
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index a5df3e994f04..8a0714bc52db 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -639,15 +639,15 @@ SYM_DATA_START_PAGE_ALIGNED(level2_kernel_pgt)
SYM_DATA_END(level2_kernel_pgt)
SYM_DATA_START_PAGE_ALIGNED(level2_fixmap_pgt)
- .fill (512 - 4 - FIXMAP_PMD_NUM),8,0
+ .fill (512 - 5 - FIXMAP_PMD_NUM),8,0
pgtno = 0
.rept (FIXMAP_PMD_NUM)
.quad level1_fixmap_pgt + (pgtno << PAGE_SHIFT) - __START_KERNEL_map \
+ _PAGE_TABLE_NOENC;
pgtno = pgtno + 1
.endr
- /* 6 MB reserved space + a 2MB hole */
- .fill 4,8,0
+ /* 2MB (with 4KB vsyscall page inside) + 6 MB reserved space + a 2MB hole */
+ .fill 5,8,0
SYM_DATA_END(level2_fixmap_pgt)
SYM_DATA_START_PAGE_ALIGNED(level1_fixmap_pgt)
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index e4399983c50c..988478e7ef1f 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -23,7 +23,6 @@
#include <asm/cpufeature.h> /* boot_cpu_has, ... */
#include <asm/traps.h> /* dotraplinkage, ... */
-#include <asm/fixmap.h> /* VSYSCALL_ADDR */
#include <asm/vsyscall.h> /* emulate_vsyscall */
#include <asm/vm86.h> /* struct vm86 */
#include <asm/mmu_context.h> /* vma_pkey() */
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index a190aae8ceaf..b7fd05a1ba1d 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -40,7 +40,7 @@
#include <linux/uaccess.h>
#include <asm/pgalloc.h>
#include <asm/dma.h>
-#include <asm/fixmap.h>
+#include <asm/vsyscall.h>
#include <asm/e820/api.h>
#include <asm/apic.h>
#include <asm/tlb.h>
--
2.31.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH RFC 4/4] x86/fixmap: Unify FIXADDR_TOP
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
` (2 preceding siblings ...)
2023-05-15 8:19 ` [PATCH RFC 3/4] x86/fixmap: Move vsyscall page " Hou Wenlong
@ 2023-05-15 8:19 ` Hou Wenlong
2023-06-07 7:44 ` [PATCH RFC 0/4] " Hou Wenlong
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Hou Wenlong @ 2023-05-15 8:19 UTC (permalink / raw)
To: linux-kernel
Cc: Lai Jiangshan, Hou Wenlong, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H. Peter Anvin,
Andy Lutomirski, Peter Zijlstra, Juergen Gross, Anshuman Khandual,
Mike Rapoport, Josh Poimboeuf, Pasha Tatashin
Since FIXADDR_TOP is unrelated to the vsyscall page now, it can be
declared as a variable for x86_64, thereby unifying it for x86.
Suggested-by: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Signed-off-by: Hou Wenlong <houwenlong.hwl@antgroup.com>
---
arch/x86/include/asm/fixmap.h | 13 -------------
arch/x86/kernel/head64.c | 1 -
arch/x86/mm/dump_pagetables.c | 3 ++-
arch/x86/mm/ioremap.c | 5 ++---
arch/x86/mm/pgtable.c | 13 +++++++++++++
arch/x86/mm/pgtable_32.c | 3 ---
6 files changed, 17 insertions(+), 21 deletions(-)
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h
index eeb152ad9682..9433109e4853 100644
--- a/arch/x86/include/asm/fixmap.h
+++ b/arch/x86/include/asm/fixmap.h
@@ -40,21 +40,8 @@
#include <linux/threads.h>
#endif
-/*
- * We can't declare FIXADDR_TOP as variable for x86_64 because vsyscall
- * uses fixmaps that relies on FIXADDR_TOP for proper address calculation.
- * Because of this, FIXADDR_TOP x86 integration was left as later work.
- */
-#ifdef CONFIG_X86_32
-/*
- * Leave one empty page between vmalloc'ed areas and
- * the start of the fixmap.
- */
extern unsigned long __FIXADDR_TOP;
#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
-#else
-#define FIXADDR_TOP (0xffffffffff600000UL - PAGE_SIZE)
-#endif
/*
* Here we define all the compile-time 'special' virtual
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 49f7629b17f7..34fc86e81872 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -485,7 +485,6 @@ asmlinkage __visible void __init __noreturn x86_64_start_kernel(char * real_mode
BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL));
MAYBE_BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) ==
(__START_KERNEL & PGDIR_MASK)));
- BUILD_BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END);
cr4_init_shadow();
diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c
index e1b599ecbbc2..df1a708a038a 100644
--- a/arch/x86/mm/dump_pagetables.c
+++ b/arch/x86/mm/dump_pagetables.c
@@ -104,7 +104,7 @@ static struct addr_marker address_markers[] = {
[HIGH_KERNEL_NR] = { __START_KERNEL_map, "High Kernel Mapping" },
[MODULES_VADDR_NR] = { MODULES_VADDR, "Modules" },
[MODULES_END_NR] = { MODULES_END, "End Modules" },
- [FIXADDR_START_NR] = { FIXADDR_START, "Fixmap Area" },
+ [FIXADDR_START_NR] = { 0UL, "Fixmap Area" },
[END_OF_SPACE_NR] = { -1, NULL }
};
@@ -453,6 +453,7 @@ static int __init pt_dump_init(void)
address_markers[KASAN_SHADOW_START_NR].start_address = KASAN_SHADOW_START;
address_markers[KASAN_SHADOW_END_NR].start_address = KASAN_SHADOW_END;
#endif
+ address_markers[FIXADDR_START_NR].start_address = FIXADDR_START;
#endif
#ifdef CONFIG_X86_32
address_markers[VMALLOC_START_NR].start_address = VMALLOC_START;
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index aa7d279321ea..44f9c6781c15 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -879,10 +879,9 @@ void __init early_ioremap_init(void)
pmd_t *pmd;
#ifdef CONFIG_X86_64
- BUILD_BUG_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
-#else
- WARN_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
+ BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END);
#endif
+ WARN_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
early_ioremap_setup();
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index e4f499eb0f29..2d73db9c7cbc 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -627,6 +627,19 @@ pmd_t pmdp_invalidate_ad(struct vm_area_struct *vma, unsigned long address,
}
#endif
+#ifdef CONFIG_X86_32
+/*
+ * Leave one empty page between vmalloc'ed areas and
+ * the start of the fixmap.
+ */
+#define __FIXADDR_TOP_BASE 0xfffff000
+#else
+#define __FIXADDR_TOP_BASE (0xffffffffff600000UL - PAGE_SIZE)
+#endif
+
+unsigned long __FIXADDR_TOP = __FIXADDR_TOP_BASE;
+EXPORT_SYMBOL(__FIXADDR_TOP);
+
/**
* reserve_top_address - reserves a hole in the top of kernel address space
* @reserve - size of hole to reserve
diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c
index c234634e26ba..2b9a00976fee 100644
--- a/arch/x86/mm/pgtable_32.c
+++ b/arch/x86/mm/pgtable_32.c
@@ -65,9 +65,6 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pteval)
flush_tlb_one_kernel(vaddr);
}
-unsigned long __FIXADDR_TOP = 0xfffff000;
-EXPORT_SYMBOL(__FIXADDR_TOP);
-
/*
* vmalloc=size forces the vmalloc area to be exactly 'size'
* bytes. This can be used to increase (or decrease) the
--
2.31.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
` (3 preceding siblings ...)
2023-05-15 8:19 ` [PATCH RFC 4/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
@ 2023-06-07 7:44 ` Hou Wenlong
2023-06-07 12:49 ` Dave Hansen
2023-06-07 18:29 ` Thomas Gleixner
6 siblings, 0 replies; 10+ messages in thread
From: Hou Wenlong @ 2023-06-07 7:44 UTC (permalink / raw)
To: linux-kernel
Cc: Lai Jiangshan, Alexey Makhalov, Andrew Morton, Andy Lutomirski,
Anshuman Khandual, Borislav Petkov, Boris Ostrovsky, Brian Gerst,
Dave Hansen, David Woodhouse, H. Peter Anvin, Ingo Molnar,
Josh Poimboeuf, Juergen Gross, Kirill A. Shutemov,
Mike Rapoport (IBM), Pasha Tatashin, Peter Zijlstra,
Srivatsa S. Bhat (VMware), Suren Baghdasaryan, Thomas Gleixner,
Usama Arif, virtualization, VMware PV-Drivers Reviewers, x86,
xen-devel
On Mon, May 15, 2023 at 04:19:31PM +0800, Hou Wenlong wrote:
> This patchset unifies FIXADDR_TOP as a variable for x86, allowing the
> fixmap area to be movable and relocated with the kernel image in the
> x86/PIE patchset [0]. This enables the kernel image to be relocated in
> the top 512G of the address space.
>
> [0] https://lore.kernel.org/lkml/cover.1682673542.git.houwenlong.hwl@antgroup.com
>
> Hou Wenlong (4):
> x86/vsyscall: Don't use set_fixmap() to map vsyscall page
> x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap
> area
> x86/fixmap: Move vsyscall page out of fixmap area
> x86/fixmap: Unify FIXADDR_TOP
>
> arch/x86/entry/vsyscall/vsyscall_64.c | 7 +-----
> arch/x86/include/asm/fixmap.h | 28 ++++-------------------
> arch/x86/include/asm/paravirt.h | 7 ++++++
> arch/x86/include/asm/paravirt_types.h | 4 ++++
> arch/x86/include/asm/vsyscall.h | 13 +++++++++++
> arch/x86/kernel/head64.c | 1 -
> arch/x86/kernel/head_64.S | 6 ++---
> arch/x86/kernel/paravirt.c | 4 ++++
> arch/x86/mm/dump_pagetables.c | 3 ++-
> arch/x86/mm/fault.c | 1 -
> arch/x86/mm/init_64.c | 2 +-
> arch/x86/mm/ioremap.c | 5 ++---
> arch/x86/mm/pgtable.c | 13 +++++++++++
> arch/x86/mm/pgtable_32.c | 3 ---
> arch/x86/xen/mmu_pv.c | 32 +++++++++++++++++++--------
> 15 files changed, 77 insertions(+), 52 deletions(-)
>
>
> base-commit: f585d5177e1aad174fd6da0e3936b682ed58ced0
> --
> 2.31.1
Hi,
Just wanted to send a kind ping on this patchset.
Thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
` (4 preceding siblings ...)
2023-06-07 7:44 ` [PATCH RFC 0/4] " Hou Wenlong
@ 2023-06-07 12:49 ` Dave Hansen
2023-06-08 9:33 ` Hou Wenlong
2023-06-07 18:29 ` Thomas Gleixner
6 siblings, 1 reply; 10+ messages in thread
From: Dave Hansen @ 2023-06-07 12:49 UTC (permalink / raw)
To: Hou Wenlong, linux-kernel
Cc: Lai Jiangshan, Alexey Makhalov, Andrew Morton, Andy Lutomirski,
Anshuman Khandual, Borislav Petkov, Boris Ostrovsky, Brian Gerst,
Dave Hansen, David Woodhouse, H. Peter Anvin, Ingo Molnar,
Josh Poimboeuf, Juergen Gross, Kirill A. Shutemov,
Mike Rapoport (IBM), Pasha Tatashin, Peter Zijlstra,
Srivatsa S. Bhat (VMware), Suren Baghdasaryan, Thomas Gleixner,
Usama Arif, virtualization, VMware PV-Drivers Reviewers, x86,
xen-devel
On 5/15/23 01:19, Hou Wenlong wrote:
> This patchset unifies FIXADDR_TOP as a variable for x86, allowing the
> fixmap area to be movable and relocated with the kernel image in the
> x86/PIE patchset [0]. This enables the kernel image to be relocated in
> the top 512G of the address space.
What problems does this patch set solve? How might that solution be
visible to end users? Why is this problem important to you?
Also, while you're waiting for someone to review _your_ code, have you
considered reviewing anyone else's code? I don't think I've seen any
review activity from you lately.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
` (5 preceding siblings ...)
2023-06-07 12:49 ` Dave Hansen
@ 2023-06-07 18:29 ` Thomas Gleixner
6 siblings, 0 replies; 10+ messages in thread
From: Thomas Gleixner @ 2023-06-07 18:29 UTC (permalink / raw)
To: Hou Wenlong, linux-kernel
Cc: Lai Jiangshan, Hou Wenlong, Alexey Makhalov, Andrew Morton,
Andy Lutomirski, Anshuman Khandual, Borislav Petkov,
Boris Ostrovsky, Brian Gerst, Dave Hansen, David Woodhouse,
H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Juergen Gross,
Kirill A. Shutemov, Mike Rapoport (IBM), Pasha Tatashin,
Peter Zijlstra, Srivatsa S. Bhat (VMware), Suren Baghdasaryan,
Usama Arif, virtualization, VMware PV-Drivers Reviewers, x86,
xen-devel
On Mon, May 15 2023 at 16:19, Hou Wenlong wrote:
> This patchset unifies FIXADDR_TOP as a variable for x86, allowing the
> fixmap area to be movable and relocated with the kernel image in the
> x86/PIE patchset [0]. This enables the kernel image to be relocated in
> the top 512G of the address space.
What for? What's the use case.
Please provide a proper argument why this is generally useful and
important.
Thanks,
tglx
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP
2023-06-07 12:49 ` Dave Hansen
@ 2023-06-08 9:33 ` Hou Wenlong
2023-06-10 18:37 ` Thomas Gleixner
0 siblings, 1 reply; 10+ messages in thread
From: Hou Wenlong @ 2023-06-08 9:33 UTC (permalink / raw)
To: Dave Hansen
Cc: linux-kernel, Lai Jiangshan, Alexey Makhalov, Andrew Morton,
Andy Lutomirski, Anshuman Khandual, Borislav Petkov,
Boris Ostrovsky, Brian Gerst, Dave Hansen, David Woodhouse,
H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Juergen Gross,
Kirill A. Shutemov, Mike Rapoport (IBM), Pasha Tatashin,
Peter Zijlstra, Srivatsa S. Bhat (VMware), Suren Baghdasaryan,
Thomas Gleixner, Usama Arif, virtualization,
VMware PV-Drivers Reviewers, x86, xen-devel
On Wed, Jun 07, 2023 at 08:49:15PM +0800, Dave Hansen wrote:
> On 5/15/23 01:19, Hou Wenlong wrote:
> > This patchset unifies FIXADDR_TOP as a variable for x86, allowing the
> > fixmap area to be movable and relocated with the kernel image in the
> > x86/PIE patchset [0]. This enables the kernel image to be relocated in
> > the top 512G of the address space.
>
> What problems does this patch set solve? How might that solution be
> visible to end users? Why is this problem important to you?
>
> Also, while you're waiting for someone to review _your_ code, have you
> considered reviewing anyone else's code? I don't think I've seen any
> review activity from you lately.
Hello,
Sorry for bothering you. This patch is not important; it is just a part
of our PIE patchset. I should be more patient.
We want to build the kernel as PIE and allow the kernel image area,
including the fixmap area, to be placed at any virtual address. We have
also implemented a PV Linux guest based on PIE, which can be used in
software virtualization similar to Lguest. PIE makes the guest kernel
share the host kernel space similar to a normal userspace process.
Additionally, we are considering whether it is possible to use PIE and
PVOPS to implement a user-mode kernel.
Thank you for your advice. I will participate more actively in community
review activities. Sorry again for bothering you.
Thanks.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP
2023-06-08 9:33 ` Hou Wenlong
@ 2023-06-10 18:37 ` Thomas Gleixner
0 siblings, 0 replies; 10+ messages in thread
From: Thomas Gleixner @ 2023-06-10 18:37 UTC (permalink / raw)
To: Hou Wenlong, Dave Hansen
Cc: linux-kernel, Lai Jiangshan, Alexey Makhalov, Andrew Morton,
Andy Lutomirski, Anshuman Khandual, Borislav Petkov,
Boris Ostrovsky, Brian Gerst, Dave Hansen, David Woodhouse,
H. Peter Anvin, Ingo Molnar, Josh Poimboeuf, Juergen Gross,
Kirill A. Shutemov, Mike Rapoport (IBM), Pasha Tatashin,
Peter Zijlstra, Srivatsa S. Bhat (VMware), Suren Baghdasaryan,
Usama Arif, virtualization, VMware PV-Drivers Reviewers, x86,
xen-devel
On Thu, Jun 08 2023 at 17:33, Hou Wenlong wrote:
> On Wed, Jun 07, 2023 at 08:49:15PM +0800, Dave Hansen wrote:
>> What problems does this patch set solve? How might that solution be
>> visible to end users? Why is this problem important to you?
>
> We want to build the kernel as PIE and allow the kernel image area,
> including the fixmap area, to be placed at any virtual address.
You are still failing to tell us why you want that and which problem
this solves. Just that fact that you want to something is not an
argument.
> We have also implemented a PV Linux guest based on PIE, which can be
> used in software virtualization similar to Lguest. PIE makes the guest
> kernel share the host kernel space similar to a normal userspace
> process. Additionally, we are considering whether it is possible to
> use PIE and PVOPS to implement a user-mode kernel.
That solves what?
Thanks,
tglx
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-06-10 18:37 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-15 8:19 [PATCH RFC 0/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 1/4] x86/vsyscall: Don't use set_fixmap() to map vsyscall page Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 2/4] x86/xen: Pin up to VSYSCALL_ADDR when vsyscall page is out of fixmap area Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 3/4] x86/fixmap: Move vsyscall page " Hou Wenlong
2023-05-15 8:19 ` [PATCH RFC 4/4] x86/fixmap: Unify FIXADDR_TOP Hou Wenlong
2023-06-07 7:44 ` [PATCH RFC 0/4] " Hou Wenlong
2023-06-07 12:49 ` Dave Hansen
2023-06-08 9:33 ` Hou Wenlong
2023-06-10 18:37 ` Thomas Gleixner
2023-06-07 18:29 ` Thomas Gleixner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox