aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@SteelEye.com>2006-03-26 04:36:57 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-26 11:56:53 -0500
commit03beb07664d768db97bf454ae5c9581cd4737bb4 (patch)
treeb906c4db3a70627a58363193f3f843e7e2132ca1
parent64a07bd82ed526d813b64b0957543eef55bdf9c0 (diff)
[PATCH] Add API for flushing Anon pages
Currently, get_user_pages() returns fully coherent pages to the kernel for anything other than anonymous pages. This is a problem for things like fuse and the SCSI generic ioctl SG_IO which can potentially wish to do DMA to anonymous pages passed in by users. The fix is to add a new memory management API: flush_anon_page() which is used in get_user_pages() to make anonymous pages coherent. Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com> Cc: Russell King <rmk@arm.linux.org.uk> Cc: "David S. Miller" <davem@davemloft.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--Documentation/cachetlb.txt9
-rw-r--r--include/linux/highmem.h6
-rw-r--r--mm/memory.c2
3 files changed, 17 insertions, 0 deletions
diff --git a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt
index 4ae418889b88..1f312a9893d9 100644
--- a/Documentation/cachetlb.txt
+++ b/Documentation/cachetlb.txt
@@ -362,6 +362,15 @@ maps this page at its virtual address.
362 likely that you will need to flush the instruction cache 362 likely that you will need to flush the instruction cache
363 for copy_to_user_page(). 363 for copy_to_user_page().
364 364
365 void flush_anon_page(struct page *page, unsigned long vmaddr)
366 When the kernel needs to access the contents of an anonymous
367 page, it calls this function (currently only
368 get_user_pages()). Note: flush_dcache_page() deliberately
369 doesn't work for an anonymous page. The default
370 implementation is a nop (and should remain so for all coherent
371 architectures). For incoherent architectures, it should flush
372 the cache of the page at vmaddr in the current user process.
373
365 void flush_icache_range(unsigned long start, unsigned long end) 374 void flush_icache_range(unsigned long start, unsigned long end)
366 When the kernel stores into addresses that it will execute 375 When the kernel stores into addresses that it will execute
367 out of (eg when loading modules), this function is called. 376 out of (eg when loading modules), this function is called.
diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 6bece9280eb7..7bd2593dbef9 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -7,6 +7,12 @@
7 7
8#include <asm/cacheflush.h> 8#include <asm/cacheflush.h>
9 9
10#ifndef ARCH_HAS_FLUSH_ANON_PAGE
11static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
12{
13}
14#endif
15
10#ifdef CONFIG_HIGHMEM 16#ifdef CONFIG_HIGHMEM
11 17
12#include <asm/highmem.h> 18#include <asm/highmem.h>
diff --git a/mm/memory.c b/mm/memory.c
index e347e106ca3a..67686048f094 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1071,6 +1071,8 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
1071 } 1071 }
1072 if (pages) { 1072 if (pages) {
1073 pages[i] = page; 1073 pages[i] = page;
1074
1075 flush_anon_page(page, start);
1074 flush_dcache_page(page); 1076 flush_dcache_page(page);
1075 } 1077 }
1076 if (vmas) 1078 if (vmas)