Add a kludge-around to fix cd/wt bits in fb ptes on linux.
Mmap from /sys/devices/pci* on linux forces the cache-disable and write-through bits, which turns our write-combining map into an uncached-map, seriously impacting performance. It turns out that a bug in mprotect allows us to fix this by disabling access to those pages and then immediately re-enabling them.
This commit is contained in:
parent
0ae283582d
commit
c3fb62df4e
|
|
@ -44,6 +44,9 @@ AM_PROG_CC_C_O
|
|||
AC_CHECK_PROG(gen4asm, [intel-gen4asm], yes, no)
|
||||
AM_CONDITIONAL(HAVE_GEN4ASM, test x$gen4asm = xyes)
|
||||
|
||||
AC_CHECK_HEADERS(sys/mman.h)
|
||||
AC_CHECK_FUNCS(mprotect)
|
||||
|
||||
AH_TOP([#include "xorg-server.h"])
|
||||
|
||||
AC_ARG_WITH(xorg-module-dir,
|
||||
|
|
|
|||
|
|
@ -197,6 +197,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "i830_debug.h"
|
||||
#include "i830_bios.h"
|
||||
#include "i830_video.h"
|
||||
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#ifdef INTEL_XVMC
|
||||
#define _INTEL_XVMC_SERVER_
|
||||
|
|
@ -685,6 +688,13 @@ I830MapMem(ScrnInfoPtr pScrn)
|
|||
err = pci_device_map_range (device, pI830->LinearAddr, pI830->FbMapSize,
|
||||
PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE,
|
||||
(void **) &pI830->FbBase);
|
||||
if (err)
|
||||
return FALSE;
|
||||
/* KLUDGE ALERT -- rewrite the PTEs to turn off the CD and WT bits */
|
||||
#if HAVE_MPROTECT
|
||||
mprotect (pI830->FbBase, pI830->FbMapSize, PROT_NONE);
|
||||
mprotect (pI830->FbBase, pI830->FbMapSize, PROT_READ|PROT_WRITE);
|
||||
#endif
|
||||
#else
|
||||
pI830->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
|
||||
pI830->PciTag,
|
||||
|
|
|
|||
Loading…
Reference in New Issue