Messages in this thread Patch in this message | | | Date | Tue, 31 Mar 2009 13:45:17 -0700 | Subject | Re: 2.6.29 git master and PAT problems | From | Yinghai Lu <> |
| |
On Tue, Mar 31, 2009 at 12:44 AM, Arkadiusz Miskiewicz <a.miskiewicz@gmail.com> wrote: > On Tuesday 31 of March 2009, Pallipadi, Venkatesh wrote: >> On Mon, Mar 30, 2009 at 04:25:11PM -0700, Arkadiusz Miskiewicz wrote: >> > On Tuesday 31 of March 2009, Arkadiusz Miskiewicz wrote: >> > > On Monday 30 of March 2009, Pallipadi, Venkatesh wrote: >> > > >> > > More info follows. Now I've switched to >> > > e1c502482853f84606928f5a2f2eb6da1993cda1 which contains latest drm >> > > fixes and now I get much lower numbers of PAT errors but still. >> > >> > Also when I switch t400 into discrete mode (radeon hd 3400 instead >> > of integrated intel GM45) I get such errors (probably unrelated >> > to these seen when using intel): >> > >> > [ 419.187657] X:10550 conflicting memory types cfff0000-d0000000 >> > uncached<->uncached-minus [ 419.187670] reserve_memtype failed >> > 0xcfff0000-0xd0000000, track uncached, req write-back [ 419.553914] >> > X:10550 conflicting memory types cfff0000-d0000000 >> > uncached<->uncached-minus [ 419.553923] reserve_memtype failed >> > 0xcfff0000-0xd0000000, track uncached, req write-back [ 419.813592] >> > X:10550 conflicting memory types cfff0000-d0000000 >> > uncached<->uncached-minus [ 419.813601] reserve_memtype failed >> > 0xcfff0000-0xd0000000, track uncached, req write-back [ 420.100102] >> > X:10550 conflicting memory types cfff0000-d0000000 >> > uncached<->uncached-minus [ 420.100111] reserve_memtype failed >> > 0xcfff0000-0xd0000000, track uncached, req write-back >> >> Yes. This is a different problem than the freeing invalid type one. Are >> these errors also with latest git kernel? Can you try the patch below >> (which is a part of a bigger cleanup patch I have lined up). > > It's a latest git kernel as of today morning > (latest commit is 15f7176eb1cccec0a332541285ee752b935c1c85) > + your patch. Problem persists: > > [ 74.696353] [drm] Setting GART location based on new memory map > [ 74.711520] [drm] Loading RV620 CP Microcode > [ 74.711792] [drm] Loading RV620 PFP Microcode > [ 74.726719] [drm] Resetting GPU > [ 74.726776] [drm] writeback test succeeded in 1 usecs > [ 75.256034] X:5366 conflicting memory types d0000000-e0000000 uncached-minus<->write-combining > [ 75.256043] reserve_memtype failed 0xd0000000-0xe0000000, track uncached-minus, req write-back > [ 75.849951] X:5366 conflicting memory types d0000000-e0000000 uncached-minus<->write-combining > [ 75.849960] reserve_memtype failed 0xd0000000-0xe0000000, track uncached-minus, req write-back > [ 76.054374] X:5366 conflicting memory types d0000000-e0000000 uncached-minus<->write-combining > [ 76.054377] reserve_memtype failed 0xd0000000-0xe0000000, track uncached-minus, req write-back > [ 76.074481] X:5378 freeing invalid memtype d0000000-e0000000 > [ 76.176881] X:5366 conflicting memory types d0000000-e0000000 uncached-minus<->write-combining > [ 76.176885] reserve_memtype failed 0xd0000000-0xe0000000, track uncached-minus, req write-back > [ 76.207734] X:5380 freeing invalid memtype d0000000-e0000000 > > cat /debug/x86/pat_memtype_list > PAT memtype list: > uncached-minus @ 0xbfad1000-0xbfad2000 > uncached-minus @ 0xbfad2000-0xbfad3000 > uncached-minus @ 0xbfad3000-0xbfad4000 > uncached-minus @ 0xbfb06000-0xbfb07000 > uncached-minus @ 0xbfb07000-0xbfb08000 > uncached-minus @ 0xbfd6a000-0xbfd6b000 > uncached-minus @ 0xbfd6a000-0xbfd6b000 > uncached-minus @ 0xbfd6a000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd79000-0xbfd7a000 > uncached-minus @ 0xbfd7b000-0xbfd7c000 > uncached-minus @ 0xbfd8d000-0xbfd8e000 > uncached-minus @ 0xbfd8e000-0xbfd8f000 > uncached-minus @ 0xbfd8e000-0xbfd8f000 > uncached-minus @ 0xcfff0000-0xd0000000 > uncached-minus @ 0xcfff0000-0xd0000000 > uncached-minus @ 0xcfff0000-0xd0000000 > uncached-minus @ 0xcfff0000-0xd0000000 > uncached-minus @ 0xcfff0000-0xd0000000 > write-combining @ 0xdfff0000-0xe0000000 > uncached-minus @ 0xe0000000-0xe4000000 > uncached-minus @ 0xf4200000-0xf4202000 > uncached-minus @ 0xf4300000-0xf4301000 > uncached-minus @ 0xf4301000-0xf4302000 > uncached-minus @ 0xf4301000-0xf4302000 > uncached-minus @ 0xfc200000-0xfc220000 > uncached-minus @ 0xfc220000-0xfc224000 > uncached-minus @ 0xfc225000-0xfc226000 > uncached-minus @ 0xfc226000-0xfc227000 > uncached-minus @ 0xfc226000-0xfc227000 > uncached-minus @ 0xfc227000-0xfc228000 > uncached-minus @ 0xfed00000-0xfed01000 > uncached-minus @ 0xfed1f000-0xfed20000 > cat /proc/mtrr > reg00: base=0x13c000000 ( 5056MB), size= 64MB, count=1: uncachable > reg01: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back > reg02: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back > reg03: base=0x100000000 ( 4096MB), size= 1024MB, count=1: write-back > reg04: base=0x0d0000000 ( 3328MB), size= 256MB, count=1: write-combining >
please try on attached patch on top on tip/master
http://people.redhat.com/mingo/tip.git/readme.txt
YH --- arch/x86/mm/pat.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-)
Index: linux-2.6/arch/x86/mm/pat.c =================================================================== --- linux-2.6.orig/arch/x86/mm/pat.c +++ linux-2.6/arch/x86/mm/pat.c @@ -31,7 +31,7 @@ #ifdef CONFIG_X86_PAT int __read_mostly pat_enabled = 1; -void __cpuinit pat_disable(const char *reason) +static void __cpuinit pat_disable(const char *reason) { pat_enabled = 0; printk(KERN_INFO "%s\n", reason); @@ -176,9 +176,9 @@ static unsigned long pat_x_mtrr_type(u64 { /* * Look for MTRR hint to get the effective type in case where PAT - * request is for WB. + * request is for WB or WC. */ - if (req_type == _PAGE_CACHE_WB) { + if (req_type == _PAGE_CACHE_WB || req_type == _PAGE_CACHE_WC) { u8 mtrr_type; mtrr_type = mtrr_type_lookup(start, end); @@ -191,10 +191,15 @@ static unsigned long pat_x_mtrr_type(u64 return req_type; } +static unsigned long real_type(struct memtype *entry) +{ + return pat_x_mtrr_type(entry->start, entry->end, entry->type); +} + static int chk_conflict(struct memtype *new, struct memtype *entry, unsigned long *type) { - if (new->type != entry->type) { + if (real_type(new) != real_type(entry)) { if (type) { new->type = entry->type; *type = entry->type; @@ -206,15 +211,16 @@ chk_conflict(struct memtype *new, struct list_for_each_entry_continue(entry, &memtype_list, nd) { if (new->end <= entry->start) break; - else if (new->type != entry->type) + else if (real_type(new) != real_type(entry)) goto conflict; } return 0; conflict: printk(KERN_INFO "%s:%d conflicting memory types " - "%Lx-%Lx %s<->%s\n", current->comm, current->pid, new->start, - new->end, cattr_name(new->type), cattr_name(entry->type)); + "%Lx-%Lx %s <-> %Lx-%Lx%s\n", current->comm, current->pid, + new->start, new->end, cattr_name(new->type), + entry->start, entry->end, cattr_name(entry->type)); return -EBUSY; } @@ -353,18 +359,7 @@ int reserve_memtype(u64 start, u64 end, } if (req_type == -1) { - /* - * Call mtrr_lookup to get the type hint. This is an - * optimization for /dev/mem mmap'ers into WB memory (BIOS - * tools and ACPI tools). Use WB request for WB memory and use - * UC_MINUS otherwise. - */ - u8 mtrr_type = mtrr_type_lookup(start, end); - - if (mtrr_type == MTRR_TYPE_WRBACK) - actual_type = _PAGE_CACHE_WB; - else - actual_type = _PAGE_CACHE_UC_MINUS; + actual_type = pat_x_mtrr_type(start, end, _PAGE_CACHE_WB); } else { actual_type = pat_x_mtrr_type(start, end, req_type & _PAGE_CACHE_MASK); @@ -386,7 +381,7 @@ int reserve_memtype(u64 start, u64 end, new->start = start; new->end = end; - new->type = actual_type; + new->type = req_type & _PAGE_CACHE_MASK; spin_lock(&memtype_lock); | |