lkml.org 
[lkml]   [2012]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 17/27] x86, kexec: only set ident mapping for ram.
    Date
    We should not set mapping for all under max_pfn.
    That causes same problem that is fixed by

    x86, mm: Only direct map addresses that are marked as E820_RAM

    This patch expose pfn_mapped array, and only set ident mapping for range
    in that array.

    This patch rely on new ident_mapping_init that could handle sharing
    pgd/pud between different calling.

    Signed-off-by: Yinghai Lu <yinghai@kernel.org>
    ---
    arch/x86/include/asm/page.h | 4 ++++
    arch/x86/kernel/machine_kexec_64.c | 13 ++++++++++---
    arch/x86/mm/init.c | 4 ++--
    3 files changed, 16 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
    index 8ca8283..100a20c 100644
    --- a/arch/x86/include/asm/page.h
    +++ b/arch/x86/include/asm/page.h
    @@ -17,6 +17,10 @@

    struct page;

    +#include <linux/range.h>
    +extern struct range pfn_mapped[];
    +extern int nr_pfn_mapped;
    +
    static inline void clear_user_page(void *page, unsigned long vaddr,
    struct page *pg)
    {
    diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
    index a0bf7fb..cc6d0e3 100644
    --- a/arch/x86/kernel/machine_kexec_64.c
    +++ b/arch/x86/kernel/machine_kexec_64.c
    @@ -157,9 +157,16 @@ static int init_pgtable(struct kimage *image, unsigned long start_pgtable)

    level4p = (pgd_t *)__va(start_pgtable);
    clear_page(level4p);
    - result = ident_mapping_init(image, level4p, 0, max_pfn << PAGE_SHIFT);
    - if (result)
    - return result;
    +
    + for (i = 0; i < nr_pfn_mapped; i++) {
    + mstart = pfn_mapped[i].start << PAGE_SHIFT;
    + mend = pfn_mapped[i].end << PAGE_SHIFT;
    +
    + result = ident_mapping_init(image, level4p, mstart, mend);
    +
    + if (result)
    + return result;
    + }

    /*
    * segments's mem ranges could be outside 0 ~ max_pfn,
    diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
    index c4293cf..7621772 100644
    --- a/arch/x86/mm/init.c
    +++ b/arch/x86/mm/init.c
    @@ -300,8 +300,8 @@ static int __meminit split_mem_range(struct map_range *mr, int nr_range,
    return nr_range;
    }

    -static struct range pfn_mapped[E820_X_MAX];
    -static int nr_pfn_mapped;
    +struct range pfn_mapped[E820_X_MAX];
    +int nr_pfn_mapped;

    static void add_pfn_range_mapped(unsigned long start_pfn, unsigned long end_pfn)
    {
    --
    1.7.10.4


    \
     
     \ /
      Last update: 2012-12-14 00:41    [W:4.350 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site