[BUG sparc64] 2.6.16-git6 broke X11 on Ultra5 with ATI Mach64

From: Mikael Pettersson
Date: Mon Jul 03 2006 - 07:16:13 EST


In 2.6.17 sparc64 kernels, X11 runs _extremely_ slowly with
frequent lock-up like behaviour on my Ultra5 (ATI Mach64).

I finally managed to trace the cause to this change in 2.6.16-git6:

diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c
index 580b63d..8cb0620 100644
--- a/arch/sparc64/mm/generic.c
+++ b/arch/sparc64/mm/generic.c
@@ -144,7 +140,6 @@ int io_remap_pfn_range(struct vm_area_st
vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP;
vma->vm_pgoff = phys_base >> PAGE_SHIFT;

- prot = __pgprot(pg_iobits);
offset -= from;
dir = pgd_offset(mm, from);
flush_cache_range(vma, beg, end);

Reverting this patch fixes my X11 problems.

Adding a debug printk and a dump_stack there, plus a hack to
sys_mmap() to store away its parameters, shows:

io_remap_pfn_range: prot 0x8000000000000788, pg_iobits 0x8000000000000f8a, mmap() in 1961(X), prot 0x3, flags 0x1
Call Trace:
[00000000004eb9a0] proc_bus_pci_mmap+0x38/0x54
[000000000047122c] do_mmap_pgoff+0x474/0x674
[000000000041f02c] sys_mmap+0x178/0x1b0
[00000000004069d4] linux_sparc_syscall32+0x34/0x40
[0000000000072b78] 0x72b78

I.e., X did a simple PROT_READ|PROT_WRITE MAP_SHARED mmap() of
something PCI-related, presumably the ATI card. The protection
bits passed into io_remap_pfn_range() are 0x80...0788, while
pg_iobits are 0x80...0f8a. Current kernels obey the prot bits,
which, if I read things correctly, means that _PAGE_W_4U and
_PAGE_MODIFIED_4U don't get set any more.

I guess something else in the kernel should have set those
bits before they got to io_remap_pfn_range()?

/Mikael
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/