aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@SteelEye.com>2006-03-26 04:36:59 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-03-26 11:56:53 -0500
commit5a3a5a98b6422d05c39eaa32c8b3f83840c7b768 (patch)
treee96a8f5543c94c57eb2b761fa94df9f7a9412e52
parent03beb07664d768db97bf454ae5c9581cd4737bb4 (diff)
[PATCH] Add flush_kernel_dcache_page() API
We have a problem in a lot of emulated storage in that it takes a page from get_user_pages() and does something like kmap_atomic(page) modify page kunmap_atomic(page) However, nothing has flushed the kernel cache view of the page before the kunmap. We need a lightweight API to do this, so this new API would specifically be for flushing the kernel cache view of a user page which the kernel has modified. The driver would need to add flush_kernel_dcache_page(page) before the final kunmap. 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.txt12
-rw-r--r--include/linux/highmem.h6
2 files changed, 18 insertions, 0 deletions
diff --git a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt
index 1f312a9893d9..53245c429f7d 100644
--- a/Documentation/cachetlb.txt
+++ b/Documentation/cachetlb.txt
@@ -371,6 +371,18 @@ maps this page at its virtual address.
371 architectures). For incoherent architectures, it should flush 371 architectures). For incoherent architectures, it should flush
372 the cache of the page at vmaddr in the current user process. 372 the cache of the page at vmaddr in the current user process.
373 373
374 void flush_kernel_dcache_page(struct page *page)
375 When the kernel needs to modify a user page is has obtained
376 with kmap, it calls this function after all modifications are
377 complete (but before kunmapping it) to bring the underlying
378 page up to date. It is assumed here that the user has no
379 incoherent cached copies (i.e. the original page was obtained
380 from a mechanism like get_user_pages()). The default
381 implementation is a nop and should remain so on all coherent
382 architectures. On incoherent architectures, this should flush
383 the kernel cache for page (using page_address(page)).
384
385
374 void flush_icache_range(unsigned long start, unsigned long end) 386 void flush_icache_range(unsigned long start, unsigned long end)
375 When the kernel stores into addresses that it will execute 387 When the kernel stores into addresses that it will execute
376 out of (eg when loading modules), this function is called. 388 out of (eg when loading modules), this function is called.
diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 7bd2593dbef9..892c4ea1b425 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -13,6 +13,12 @@ static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
13} 13}
14#endif 14#endif
15 15
16#ifndef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
17static inline void flush_kernel_dcache_page(struct page *page)
18{
19}
20#endif
21
16#ifdef CONFIG_HIGHMEM 22#ifdef CONFIG_HIGHMEM
17 23
18#include <asm/highmem.h> 24#include <asm/highmem.h>