vserver 2.0-pre1
[linux-2.6.git] / include / asm-parisc / cacheflush.h
index 3086cda..a3132a2 100644 (file)
@@ -33,36 +33,25 @@ static inline void flush_cache_all(void)
 #define flush_cache_vmap(start, end)           flush_cache_all()
 #define flush_cache_vunmap(start, end)         flush_cache_all()
 
-/* The following value needs to be tuned and probably scaled with the
- * cache size.
- */
-
-#define FLUSH_THRESHOLD 0x80000
+extern int parisc_cache_flush_threshold;
+void parisc_setup_cache_timing(void);
 
 static inline void
 flush_user_dcache_range(unsigned long start, unsigned long end)
 {
-#ifdef CONFIG_SMP
-       flush_user_dcache_range_asm(start,end);
-#else
-       if ((end - start) < FLUSH_THRESHOLD)
+       if ((end - start) < parisc_cache_flush_threshold)
                flush_user_dcache_range_asm(start,end);
        else
                flush_data_cache();
-#endif
 }
 
 static inline void
 flush_user_icache_range(unsigned long start, unsigned long end)
 {
-#ifdef CONFIG_SMP
-       flush_user_icache_range_asm(start,end);
-#else
-       if ((end - start) < FLUSH_THRESHOLD)
+       if ((end - start) < parisc_cache_flush_threshold)
                flush_user_icache_range_asm(start,end);
        else
                flush_instruction_cache();
-#endif
 }
 
 extern void flush_dcache_page(struct page *page);
@@ -77,11 +66,17 @@ extern void flush_dcache_page(struct page *page);
 #define flush_icache_range(s,e)                do { flush_kernel_dcache_range_asm(s,e); flush_kernel_icache_range_asm(s,e); } while (0)
 
 #define copy_to_user_page(vma, page, vaddr, dst, src, len) \
-do { memcpy(dst, src, len); \
-     flush_kernel_dcache_range_asm((unsigned long)dst, (unsigned long)dst + len); \
+do { \
+       flush_cache_page(vma, vaddr); \
+       memcpy(dst, src, len); \
+       flush_kernel_dcache_range_asm((unsigned long)dst, (unsigned long)dst + len); \
 } while (0)
+
 #define copy_from_user_page(vma, page, vaddr, dst, src, len) \
-       memcpy(dst, src, len)
+do { \
+       flush_cache_page(vma, vaddr); \
+       memcpy(dst, src, len); \
+} while (0)
 
 static inline void flush_cache_range(struct vm_area_struct *vma,
                unsigned long start, unsigned long end)