lkml.org 
[lkml]   [2008]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [Bug 11388] New: 2.6.27-rc3 warns about MTRR range; only 3 of 16gb of memory is usable
    On Wed, Aug 20, 2008 at 6:20 PM, Yinghai Lu <yhlu.kernel@gmail.com> wrote:
    > On Wed, Aug 20, 2008 at 6:04 PM, Andrew Morton
    > <akpm@linux-foundation.org> wrote:
    >>
    >> (switched to email. Please respond via emailed reply-to-all, not via the
    >> bugzilla web interface).
    >>
    >> On Wed, 20 Aug 2008 17:38:59 -0700 (PDT)
    >> bugme-daemon@bugzilla.kernel.org wrote:
    >>
    >>> http://bugzilla.kernel.org/show_bug.cgi?id=11388
    >>>
    >>> Summary: 2.6.27-rc3 warns about MTRR range; only 3 of 16gb of
    >>> memory is usable
    >>> Product: Memory Management
    >>> Version: 2.5
    >>> KernelVersion: 2.6.27-rc3
    >>> Platform: All
    >>> OS/Version: Linux
    >>> Tree: Mainline
    >>> Status: NEW
    >>> Severity: normal
    >>> Priority: P1
    >>> Component: MTTR
    >>> AssignedTo: akpm@osdl.org
    >>> ReportedBy: j_kernel@hoblitt.com
    >>>
    >>>
    >>> Latest working kernel version: 2.4.24.2 (possibly later)
    >>> Earliest failing kernel version: 2.6.27-rc3-21328-ga7f5aaf (from netdev-2.6)
    >>> Distribution: Gentoo
    >>> Hardware Environment: 2x Intel X5482
    >>> Software Environment:
    >>> Problem Description:
    >>>
    >>> [ 0.000000] WARNING: BIOS bug: CPU MTRRs don't cover all of memory, losing
    >>> 13056MB of RAM.
    >>> [ 0.000000] ------------[ cut here ]------------
    >>> [ 0.000000] WARNING: at arch/x86/kernel/cpu/mtrr/main.c:1561
    >>> mtrr_trim_uncached_memory+0x508/0x550()
    >>> [ 0.000000] Modules linked in:
    >>> [ 0.000000] Pid: 0, comm: swapper Not tainted 2.6.27-rc3-21328-ga7f5aaf #8
    >>> [ 0.000000]
    >>> [ 0.000000] Call Trace:
    >>> [ 0.000000] [<ffffffff80234c3e>] warn_on_slowpath+0x51/0x77
    >>> [ 0.000000] [<ffffffff8023570a>] printk+0x4e/0x56
    >>> [ 0.000000] [<ffffffff803add02>] sort+0xfa/0x18c
    >>> [ 0.000000] [<ffffffff808283d3>] cmp_range+0x0/0x6
    >>> [ 0.000000] [<ffffffff80828a47>] mtrr_trim_uncached_memory+0x508/0x550
    >>> [ 0.000000] [<ffffffff802178e1>] post_set+0x20/0x3d
    >>> [ 0.000000] [<ffffffff80824f99>] setup_arch+0x39d/0x6be
    >>> [ 0.000000] [<ffffffff8081e962>] start_kernel+0x74/0x341
    >>> [ 0.000000] [<ffffffff8081e394>] x86_64_start_kernel+0xe3/0xe7
    >>> [ 0.000000]
    >>> [ 0.000000] ---[ end trace 4eaa2a86a8e2da22 ]---
    >>>
    >>>
    >>> Steps to reproduce:
    >>>
    >>> This warning isn't present under 2.6.24.2 and the full range of physical memory
    >>> is usable.
    >>
    >> Looks like a post-2.6.26 regression caused by
    >> 12031a624af7816ec7660b82be648aa3703b4ebe.
    > reg00: base=0xd0000000 (3328MB), size=196864MB: uncachable, count=1
    > reg01: base=0xe0000000 (3584MB), size=197120MB: uncachable, count=1
    > reg02: base=0x00000000 ( 0MB), size=212992MB: write-back, count=1
    > reg03: base=0x400000000 (16384MB), size=197120MB: write-back, count=1
    > reg04: base=0x420000000 (16896MB), size=196864MB: write-back, count=1
    >
    > the size mtrr looks crazy.

    please apply attached patch and boot with show_msr=1 to dump the msr
    (including mtrr)

    YH
    [PATCH] x86_64: printout msr

    commandline show_msr=1 for bsp, show_msr=32 for all 32 cpus.

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

    ---
    arch/x86/kernel/cpu/common_64.c | 46 ++++++++++++++++++++++++++++++++++++++++
    include/asm-x86/msr.h | 23 ++++++++++++++++++++
    2 files changed, 69 insertions(+)

    Index: linux-2.6/arch/x86/kernel/cpu/common_64.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/cpu/common_64.c
    +++ linux-2.6/arch/x86/kernel/cpu/common_64.c
    @@ -430,6 +430,49 @@ static __init int setup_noclflush(char *
    }
    __setup("noclflush", setup_noclflush);

    +struct msr_range {
    + unsigned min;
    + unsigned max;
    +};
    +
    +static struct msr_range msr_range_array[] __cpuinitdata = {
    + { 0x00000000, 0x00000418},
    + { 0xc0000000, 0xc000040b},
    + { 0xc0010000, 0xc0010142},
    + { 0xc0011000, 0xc001103b},
    +};
    +
    +static void __cpuinit print_cpu_msr(void)
    +{
    + unsigned index;
    + u64 val;
    + int i;
    + unsigned index_min, index_max;
    +
    + for (i = 0; i < ARRAY_SIZE(msr_range_array); i++) {
    + index_min = msr_range_array[i].min;
    + index_max = msr_range_array[i].max;
    + for (index = index_min; index < index_max; index++) {
    + if (rdmsrl_amd_safe(index, &val))
    + continue;
    + printk(KERN_INFO " MSR%08x: %016llx\n", index, val);
    + }
    + }
    +}
    +
    +static int show_msr __cpuinitdata;
    +static __init int setup_show_msr(char *arg)
    +{
    + int num;
    +
    + get_option(&arg, &num);
    +
    + if (num > 0)
    + show_msr = num;
    + return 1;
    +}
    +__setup("show_msr=", setup_show_msr);
    +
    void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
    {
    if (c->x86_model_id[0])
    @@ -439,6 +482,9 @@ void __cpuinit print_cpu_info(struct cpu
    printk(KERN_CONT " stepping %02x\n", c->x86_mask);
    else
    printk(KERN_CONT "\n");
    +
    + if (c->cpu_index < show_msr)
    + print_cpu_msr();
    }

    static __init int setup_disablecpuid(char *arg)
    Index: linux-2.6/include/asm-x86/msr.h
    ===================================================================
    --- linux-2.6.orig/include/asm-x86/msr.h
    +++ linux-2.6/include/asm-x86/msr.h
    @@ -63,6 +63,22 @@ static inline unsigned long long native_
    return EAX_EDX_VAL(val, low, high);
    }

    +static inline unsigned long long native_read_msr_amd_safe(unsigned int msr,
    + int *err)
    +{
    + DECLARE_ARGS(val, low, high);
    +
    + asm volatile("2: rdmsr ; xor %0,%0\n"
    + "1:\n\t"
    + ".section .fixup,\"ax\"\n\t"
    + "3: mov %3,%0 ; jmp 1b\n\t"
    + ".previous\n\t"
    + _ASM_EXTABLE(2b, 3b)
    + : "=r" (*err), EAX_EDX_RET(val, low, high)
    + : "c" (msr), "D" (0x9c5a203a), "i" (-EFAULT));
    + return EAX_EDX_VAL(val, low, high);
    +}
    +
    static inline void native_write_msr(unsigned int msr,
    unsigned low, unsigned high)
    {
    @@ -158,6 +174,13 @@ static inline int rdmsrl_safe(unsigned m
    *p = native_read_msr_safe(msr, &err);
    return err;
    }
    +static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p)
    +{
    + int err;
    +
    + *p = native_read_msr_amd_safe(msr, &err);
    + return err;
    +}

    #define rdtscl(low) \
    ((low) = (u32)native_read_tsc())
    \
     
     \ /
      Last update: 2008-08-21 03:53    [W:0.040 / U:0.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site