lkml.org 
[lkml]   [2018]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    Date
    From
    SubjectRe: [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
    \
     
     \ /
      Last update: 2018-09-11 08:10    [W:3.314 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site