summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-09-10 17:48:48 -0700
committerEric Anholt <eric@anholt.net>2009-09-11 11:39:23 -0700
commite517a5e97080bbe52857bd0d7df9b66602d53c4d (patch)
tree814e9345a91dba619f1c1ea4da9944e313490442 /arch
parent8082400327d8d2ca54254b593644942bed0edd25 (diff)
downloadlinux-e517a5e97080bbe52857bd0d7df9b66602d53c4d.tar.gz
linux-e517a5e97080bbe52857bd0d7df9b66602d53c4d.tar.bz2
linux-e517a5e97080bbe52857bd0d7df9b66602d53c4d.zip
agp/intel: Fix the pre-9xx chipset flush.
Ever since we enabled GEM, the pre-9xx chipsets (particularly 865) have had serious stability issues. Back in May a wbinvd was added to the DRM to work around much of the problem. Some failure remained -- easily visible by dragging a window around on an X -retro desktop, or by looking at bugzilla. The chipset flush was on the right track -- hitting the right amount of memory, and it appears to be the only way to flush on these chipsets, but the flush page was mapped uncached. As a result, the writes trying to clear the writeback cache ended up bypassing the cache, and not flushing anything! The wbinvd would flush out other writeback data and often cause the data we wanted to get flushed, but not always. By removing the setting of the page to UC and instead just clflushing the data we write to try to flush it, we get the desired behavior with no wbinvd. This exports clflush_cache_range(), which was laying around and happened to basically match the code I was otherwise going to copy from the DRM. Signed-off-by: Eric Anholt <eric@anholt.net> Signed-off-by: Brice Goglin <Brice.Goglin@ens-lyon.org> Cc: stable@kernel.org
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/mm/pageattr.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 7e600c1962db..5866b28eede1 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -143,6 +143,7 @@ void clflush_cache_range(void *vaddr, unsigned int size)
mb();
}
+EXPORT_SYMBOL_GPL(clflush_cache_range);
static void __cpa_flush_all(void *arg)
{