History

Merge branch 'parisc-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux

Pull parisc fix from Helge Deller: "This patch fixes the kmap/kunmap implementation on parisc and finally makes AIO work on parisc" * 'parisc-3.13' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: Ensure full cache coherency for kmap/kunmap

Linus Torvalds committed 12 years ago

Commit 7d1c1532 parents f882915 f8dae003 files · +6 −46Browse files

Unified · Split

3 files
  1. arch/parisc/include/asm/cacheflush.h +4 −8
  2. arch/parisc/include/asm/page.h +2 −3
  3. arch/parisc/kernel/cache.c +0 −35
arch/parisc/include/asm/cacheflush.h+4−8
@@ -125,42 +125,38 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma · 124 unmodified lines
125void mark_rodata_ro(void);125void mark_rodata_ro(void);
126#endif126#endif
127 127
128#ifdef CONFIG_PA8X00
129/* Only pa8800, pa8900 needs this */
130
131#include <asm/kmap_types.h>128#include <asm/kmap_types.h>
132 129
133#define ARCH_HAS_KMAP130#define ARCH_HAS_KMAP
134 131
135void kunmap_parisc(void *addr);
136
137static inline void *kmap(struct page *page)132static inline void *kmap(struct page *page)
138{133{
139 might_sleep();134 might_sleep();
135 flush_dcache_page(page);
140 return page_address(page);136 return page_address(page);
141}137}
142 138
143static inline void kunmap(struct page *page)139static inline void kunmap(struct page *page)
144{140{
145 kunmap_parisc(page_address(page));141 flush_kernel_dcache_page_addr(page_address(page));
146}142}
147 143
148static inline void *kmap_atomic(struct page *page)144static inline void *kmap_atomic(struct page *page)
149{145{
150 pagefault_disable();146 pagefault_disable();
147 flush_dcache_page(page);
151 return page_address(page);148 return page_address(page);
152}149}
153 150
154static inline void __kunmap_atomic(void *addr)151static inline void __kunmap_atomic(void *addr)
155{152{
156 kunmap_parisc(addr);153 flush_kernel_dcache_page_addr(addr);
157 pagefault_enable();154 pagefault_enable();
158}155}
159 156
160#define kmap_atomic_prot(page, prot) kmap_atomic(page)157#define kmap_atomic_prot(page, prot) kmap_atomic(page)
161#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn))158#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn))
162#define kmap_atomic_to_page(ptr) virt_to_page(ptr)159#define kmap_atomic_to_page(ptr) virt_to_page(ptr)
163#endif
164 160
165#endif /* _PARISC_CACHEFLUSH_H */161#endif /* _PARISC_CACHEFLUSH_H */
166 162
arch/parisc/include/asm/page.h+2−3
@@ -28,9 +28,8 @@ struct page; · 27 unmodified lines
28 28
29void clear_page_asm(void *page);29void clear_page_asm(void *page);
30void copy_page_asm(void *to, void *from);30void copy_page_asm(void *to, void *from);
31void clear_user_page(void *vto, unsigned long vaddr, struct page *pg);31#define clear_user_page(vto, vaddr, page) clear_page_asm(vto)
32void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,32#define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom)
33 struct page *pg);
34 33
35/* #define CONFIG_PARISC_TMPALIAS */34/* #define CONFIG_PARISC_TMPALIAS */
36 35
arch/parisc/kernel/cache.c+0−35
@@ -388,41 +388,6 @@ void flush_kernel_dcache_page_addr(void *addr) · 387 unmodified lines
388}388}
389EXPORT_SYMBOL(flush_kernel_dcache_page_addr);389EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
390 390
391void clear_user_page(void *vto, unsigned long vaddr, struct page *page)
392{
393 clear_page_asm(vto);
394 if (!parisc_requires_coherency())
395 flush_kernel_dcache_page_asm(vto);
396}
397EXPORT_SYMBOL(clear_user_page);
398
399void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
400 struct page *pg)
401{
402 /* Copy using kernel mapping. No coherency is needed
403 (all in kmap/kunmap) on machines that don't support
404 non-equivalent aliasing. However, the `from' page
405 needs to be flushed before it can be accessed through
406 the kernel mapping. */
407 preempt_disable();
408 flush_dcache_page_asm(__pa(vfrom), vaddr);
409 preempt_enable();
410 copy_page_asm(vto, vfrom);
411 if (!parisc_requires_coherency())
412 flush_kernel_dcache_page_asm(vto);
413}
414EXPORT_SYMBOL(copy_user_page);
415
416#ifdef CONFIG_PA8X00
417
418void kunmap_parisc(void *addr)
419{
420 if (parisc_requires_coherency())
421 flush_kernel_dcache_page_addr(addr);
422}
423EXPORT_SYMBOL(kunmap_parisc);
424#endif
425
426void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)391void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
427{392{
428 unsigned long flags;393 unsigned long flags;