[Bug 574733] [NEW] serve Xorg performance penalty due to [u]vesafb creating wrong PAT entries

Thomas Schlichter thomas.schlichter at web.de
Mon May 3 19:53:06 UTC 2010


Public bug reported:

Hi,

when using uvesafb or vesafb, these drivers will create uncached-minus
PAT entries for the framebuffer memory because they use ioremap(). WHen
the framebuffer memory intersects with the video RAM used by Xorg, the
complete video RAM will be mapped uncached-minus what results in a
server performance penalty.

Here are the correct MTRR entries created by uvesafb:
schlicht at netbook:~$ cat /proc/mtrr 
reg00: base=0x000000000 (    0MB), size= 2048MB, count=1: write-back
reg01: base=0x06ff00000 ( 1791MB), size=    1MB, count=1: uncachable
reg02: base=0x070000000 ( 1792MB), size=  256MB, count=1: uncachable
reg03: base=0x0d0000000 ( 3328MB), size=   16MB, count=1: write-combining

And here are the problematic PAT entries:
schlicht at netbook:~$ sudo cat /sys/kernel/debug/x86/pat_memtype_list 
PAT memtype list:
write-back @ 0x0-0x1000
uncached-minus @ 0x6fedd000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0xd0000000-0xe0000000  <-- created by xserver-xorg
uncached-minus @ 0xd0000000-0xd1194000  <-- created by uvesafb
uncached-minus @ 0xf4000000-0xf4009000
uncached-minus @ 0xf4200000-0xf4400000
uncached-minus @ 0xf5000000-0xf5010000
uncached-minus @ 0xf5100000-0xf5104000
uncached-minus @ 0xf5400000-0xf5404000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xfed00000-0xfed01000

Therefore I created the attached patch for uvesafb which uses ioremap_wc() to create the correct PAT entries, as shown below:
schlicht at netbook:~$ sudo cat /sys/kernel/debug/x86/pat_memtype_list 
PAT memtype list:
write-back @ 0x0-0x1000
uncached-minus @ 0x6fedd000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
write-combining @ 0xd0000000-0xe0000000
write-combining @ 0xd0000000-0xd1194000
uncached-minus @ 0xf4000000-0xf4009000
uncached-minus @ 0xf4200000-0xf4400000
uncached-minus @ 0xf5000000-0xf5010000
uncached-minus @ 0xf5100000-0xf5104000
uncached-minus @ 0xf5400000-0xf5404000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xfed00000-0xfed01000

This results in a performance gain, objectively measurable with e.g. x11perf -comppixwin10 -comppixwin100 -comppixwin500:
1: x11perf_xaa_lucid.log
2: x11perf_xaa_lucid_patched.log

    1              2           Operation
--------   -----------------   -----------------
300000.0   296000.0 (  0.99)   Composite 10x10 from window to window 
 38400.0    38500.0 (  1.00)   Composite 100x100 from window to window 
  1760.0     1760.0 (  1.00)   Composite 500x500 from window to window 
124000.0   202000.0 (  1.63)   Composite 10x10 from pixmap to window 
  3340.0    24400.0 (  7.31)   Composite 100x100 from pixmap to window 
   131.0     1150.0 (  8.78)   Composite 500x500 from pixmap to window 

You can see the serve performance gain when composing larger pixmaps to window.
Please consider applying/pushing the attached patch. I'll also attach a very similar patch for vesafb.

Kind regards,
  Thomas

** Affects: linux (Ubuntu)
     Importance: Undecided
         Status: New

-- 
serve Xorg performance penalty due to [u]vesafb creating wrong PAT entries
https://bugs.launchpad.net/bugs/574733
You received this bug notification because you are a member of Kernel
Bugs, which is subscribed to linux in ubuntu.




More information about the kernel-bugs mailing list