Messages in this thread Patches in this message | | | Date | Tue, 11 Sep 2018 14:14:13 +0800 | From | Feng Tang <> | Subject | Re: [PATCH] x86, mm: Reserver some memory for bootmem allocator for NO_BOOTMEM |
| |
Hi Thomas,
On Mon, Sep 10, 2018 at 11:53:39AM +0200, Thomas Gleixner wrote: > On Mon, 10 Sep 2018, Feng Tang wrote: > > diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c > > index e848a4811785..fc172551048a 100644 > > --- a/arch/x86/mm/pgtable.c > > +++ b/arch/x86/mm/pgtable.c > > @@ -637,6 +637,19 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) > > { > > unsigned long address = __fix_to_virt(idx); > > > > +#ifdef CONFIG_X86_64 > > + /* > > + * In arch/x86/kernel/head_64.S, the static page table > > + * has been setup for 4M space [-12M, -8M] > > + * 0xFFFFFFFFFF400000 ~ 0xFFFFFFFFFF7FFFFF > > + * Add a sanity check whether fixed_address crosses > > + * the boundary. > > + */ > > + #define FIXMAP_STATIC_PGTABLE_START 0xFFFFFFFFFF400000 > > Errm what? This is beyond hillarious, really. What helps that if I remove > that second FIXMAP entry in head_64.S? > > The size of the fixmap is known at compile time and it is known when > building head_64.S. So the obvious check is to check right there where the > static pagetable is set up and where you know how many entries you set up > whether it's covering the full size or not and err out there.
Thanks for the suggestion, and I have 2 patches: one adds a build warning, the other prepares fixmap page table on demand and doesn't need warning.
But I met a problem, that the "__end_of_permanent_fixed_addresses" is defined in fixmap.h, which is protected by #ifndef __ASSEMBLY__, also fixmap.h reference many other header file, which makes it harder to extract the definition out. Any suggestion on this? thanks!
- Feng
patch1: --- diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 3a1d33b43c29..5863623890af 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -451,12 +451,20 @@ NEXT_PAGE(level2_fixmap_pgt) .quad level1_fixmap_pgt1 - __START_KERNEL_map + _PAGE_TABLE_NOENC .fill 4,8,0 +/* + * Next are static page table for 4M fixmap space: + * [-12M, -10M], [-10M, -8M] + */ NEXT_PAGE(level1_fixmap_pgt) .fill 512,8,0 NEXT_PAGE(level1_fixmap_pgt1) .fill 512,8,0 +#if __end_of_permanent_fixed_addresses > 1024 +.error "Total fixmap space exceeds the static page table capacity, please expand the page table!" +#endif + #undef PMDS .data
Patch2: --- diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 15ebc2fc166e..2b98ce234686 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -24,6 +24,7 @@ #include "../entry/calling.h" #include <asm/export.h> #include <asm/nospec-branch.h> +#include <asm/fixmap.h> #ifdef CONFIG_PARAVIRT #include <asm/asm-offsets.h> @@ -444,14 +445,21 @@ NEXT_PAGE(level2_kernel_pgt) PMDS(0, __PAGE_KERNEL_LARGE_EXEC, KERNEL_IMAGE_SIZE/PMD_SIZE) +#define FIXMAP_PMD_NUM ((__end_of_permanent_fixed_addresses + 511) / 512) NEXT_PAGE(level2_fixmap_pgt) - .fill 506,8,0 - .quad level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE_NOENC + .fill (512 - 4 - 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 /* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */ - .fill 5,8,0 + .fill 4,8,0 NEXT_PAGE(level1_fixmap_pgt) + .rept (FIXMAP_PMD_NUM) .fill 512,8,0 + .endr #undef PMDS
| |