diff options
author | Paul Mundt <lethal@linux-sh.org> | 2007-11-05 02:12:32 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2007-11-06 21:14:12 -0500 |
commit | 7747b9a493a197cb4db44c98d25ce6d3d9f586d1 (patch) | |
tree | 636aa0624e6768ef0e8ea02d0692f91dfb51d79f /arch/sh/mm | |
parent | f96691872439ab2071171d4531c4a95b5d493ae5 (diff) |
sh: Wire up clear_user_highpage().
With the kmap_coherent() API in place, this is trivial to implement,
and lets us avoid the cache flush in certain cases.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/mm')
-rw-r--r-- | arch/sh/mm/pg-sh4.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/sh/mm/pg-sh4.c b/arch/sh/mm/pg-sh4.c index 25f5c6f6821d..ede6dd1e3701 100644 --- a/arch/sh/mm/pg-sh4.c +++ b/arch/sh/mm/pg-sh4.c | |||
@@ -9,6 +9,8 @@ | |||
9 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
10 | #include <linux/mutex.h> | 10 | #include <linux/mutex.h> |
11 | #include <linux/fs.h> | 11 | #include <linux/fs.h> |
12 | #include <linux/highmem.h> | ||
13 | #include <linux/module.h> | ||
12 | #include <asm/mmu_context.h> | 14 | #include <asm/mmu_context.h> |
13 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
14 | 16 | ||
@@ -79,6 +81,27 @@ void copy_user_page(void *to, void *from, unsigned long address, | |||
79 | } | 81 | } |
80 | } | 82 | } |
81 | 83 | ||
84 | void copy_user_highpage(struct page *to, struct page *from, | ||
85 | unsigned long vaddr, struct vm_area_struct *vma) | ||
86 | { | ||
87 | void *vfrom, *vto; | ||
88 | |||
89 | __set_bit(PG_mapped, &to->flags); | ||
90 | |||
91 | vto = kmap_atomic(to, KM_USER1); | ||
92 | vfrom = kmap_coherent(from, vaddr); | ||
93 | copy_page(vto, vfrom); | ||
94 | kunmap_coherent(vfrom); | ||
95 | |||
96 | if (((vaddr ^ (unsigned long)vto) & CACHE_ALIAS)) | ||
97 | __flush_wback_region(vto, PAGE_SIZE); | ||
98 | |||
99 | kunmap_atomic(vto, KM_USER1); | ||
100 | /* Make sure this page is cleared on other CPU's too before using it */ | ||
101 | smp_wmb(); | ||
102 | } | ||
103 | EXPORT_SYMBOL(copy_user_highpage); | ||
104 | |||
82 | /* | 105 | /* |
83 | * For SH-4, we have our own implementation for ptep_get_and_clear | 106 | * For SH-4, we have our own implementation for ptep_get_and_clear |
84 | */ | 107 | */ |