lkml.org 
[lkml]   [2008]   [Jul]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [patch] tip/x86_64: fix e820 merge issue which broke max_pfn_mapped
    On Tue, Jul 8, 2008 at 5:59 PM, Yinghai Lu <yhlu.kernel@gmail.com> wrote:
    > On Tue, Jul 8, 2008 at 4:08 PM, Suresh Siddha <suresh.b.siddha@intel.com> wrote:
    >> With out this 64bit tip/master doesn't boot using ACPI on my system.
    >> ---
    >>
    >> max_pfn_mapped should include all e820 entries.
    >> The direct mapping extends to max_pfn_mapped, so that we can directly access
    >> apertures, ACPI and other tables without having to play with fixmaps.
    >>
    >> With this, my system with 1GB memory boots fine with ACPI enabled.
    >
    > so without this patch, your system doesn't boot?

    how about attached patch?

    [PATCH] x86: make max_pfn cover acpi table below 4g

    when system have 4g less ram installed, and acpi table sit
    near end of ram. make max_pfn cover them too.
    so 64bit kernel don't need to mess up fixmap

    Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>

    YH
    [PATCH] x86: make max_pfn cover acpi table below 4g

    when system have 4g less ram installed, and acpi table sit
    near end of ram. make max_pfn cover them too.
    so 64bit kernel don't need to mess up fixmap.

    Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>

    ---
    arch/x86/kernel/e820.c | 18 ++++++++++++------
    arch/x86/kernel/setup.c | 13 +++----------
    include/asm-x86/e820.h | 2 +-
    3 files changed, 16 insertions(+), 17 deletions(-)

    Index: linux-2.6/arch/x86/kernel/e820.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/e820.c
    +++ linux-2.6/arch/x86/kernel/e820.c
    @@ -1056,12 +1056,20 @@ unsigned long __initdata end_user_pfn =
    /*
    * Find the highest page frame number we have available
    */
    -unsigned long __init e820_end_of_ram(void)
    +unsigned long __init e820_end(void)
    {
    - unsigned long last_pfn;
    + int i;
    + unsigned long last_pfn = 0;
    unsigned long max_arch_pfn = MAX_ARCH_PFN;

    - last_pfn = find_max_pfn_with_active_regions();
    + for (i = 0; i < e820.nr_map; i++) {
    + struct e820entry *ei = &e820.map[i];
    + unsigned long end_pfn;
    +
    + end_pfn = (ei->addr + ei->size) >> PAGE_SHIFT;
    + if (end_pfn > last_pfn)
    + last_pfn = end_pfn;
    + }

    if (last_pfn > max_arch_pfn)
    last_pfn = max_arch_pfn;
    @@ -1192,9 +1200,7 @@ static int __init parse_memmap_opt(char
    * the real mem size before original memory map is
    * reset.
    */
    - e820_register_active_regions(0, 0, -1UL);
    - saved_max_pfn = e820_end_of_ram();
    - remove_all_active_ranges();
    + saved_max_pfn = e820_end();
    #endif
    e820.nr_map = 0;
    userdef = 1;
    Index: linux-2.6/arch/x86/kernel/setup.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/setup.c
    +++ linux-2.6/arch/x86/kernel/setup.c
    @@ -714,22 +714,18 @@ void __init setup_arch(char **cmdline_p)
    early_gart_iommu_check();
    #endif

    - e820_register_active_regions(0, 0, -1UL);
    /*
    * partially used pages are not usable - thus
    * we are rounding upwards:
    */
    - max_pfn = e820_end_of_ram();
    + max_pfn = e820_end();

    /* preallocate 4k for mptable mpc */
    early_reserve_e820_mpc_new();
    /* update e820 for memory not covered by WB MTRRs */
    mtrr_bp_init();
    - if (mtrr_trim_uncached_memory(max_pfn)) {
    - remove_all_active_ranges();
    - e820_register_active_regions(0, 0, -1UL);
    - max_pfn = e820_end_of_ram();
    - }
    + if (mtrr_trim_uncached_memory(max_pfn))
    + max_pfn = e820_end();

    #ifdef CONFIG_X86_32
    /* max_low_pfn get updated here */
    @@ -772,9 +768,6 @@ void __init setup_arch(char **cmdline_p)
    */
    acpi_boot_table_init();

    - /* Remove active ranges so rediscovery with NUMA-awareness happens */
    - remove_all_active_ranges();
    -
    #ifdef CONFIG_ACPI_NUMA
    /*
    * Parse SRAT to discover nodes.
    Index: linux-2.6/include/asm-x86/e820.h
    ===================================================================
    --- linux-2.6.orig/include/asm-x86/e820.h
    +++ linux-2.6/include/asm-x86/e820.h
    @@ -99,7 +99,7 @@ extern void free_early(u64 start, u64 en
    extern void early_res_to_bootmem(u64 start, u64 end);
    extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align);

    -extern unsigned long e820_end_of_ram(void);
    +extern unsigned long e820_end(void);
    extern int e820_find_active_region(const struct e820entry *ei,
    unsigned long start_pfn,
    unsigned long last_pfn,
    \
     
     \ /
      Last update: 2008-07-09 03:59    [W:0.029 / U:88.228 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site