aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/parisc/include/asm/cacheflush.h24
-rw-r--r--arch/parisc/kernel/irq.c2
2 files changed, 18 insertions, 8 deletions
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h
index dc9286a4dcc7..d18328b3f938 100644
--- a/arch/parisc/include/asm/cacheflush.h
+++ b/arch/parisc/include/asm/cacheflush.h
@@ -35,6 +35,13 @@ void flush_cache_all_local(void);
35void flush_cache_all(void); 35void flush_cache_all(void);
36void flush_cache_mm(struct mm_struct *mm); 36void flush_cache_mm(struct mm_struct *mm);
37 37
38#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
39void flush_kernel_dcache_page_addr(void *addr);
40static inline void flush_kernel_dcache_page(struct page *page)
41{
42 flush_kernel_dcache_page_addr(page_address(page));
43}
44
38#define flush_kernel_dcache_range(start,size) \ 45#define flush_kernel_dcache_range(start,size) \
39 flush_kernel_dcache_range_asm((start), (start)+(size)); 46 flush_kernel_dcache_range_asm((start), (start)+(size));
40/* vmap range flushes and invalidates. Architecturally, we don't need 47/* vmap range flushes and invalidates. Architecturally, we don't need
@@ -48,6 +55,16 @@ static inline void flush_kernel_vmap_range(void *vaddr, int size)
48} 55}
49static inline void invalidate_kernel_vmap_range(void *vaddr, int size) 56static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
50{ 57{
58 unsigned long start = (unsigned long)vaddr;
59 void *cursor = vaddr;
60
61 for ( ; cursor < vaddr + size; cursor += PAGE_SIZE) {
62 struct page *page = vmalloc_to_page(cursor);
63
64 if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
65 flush_kernel_dcache_page(page);
66 }
67 flush_kernel_dcache_range_asm(start, start + size);
51} 68}
52 69
53#define flush_cache_vmap(start, end) flush_cache_all() 70#define flush_cache_vmap(start, end) flush_cache_all()
@@ -99,13 +116,6 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma
99 flush_dcache_page_asm(page_to_phys(page), vmaddr); 116 flush_dcache_page_asm(page_to_phys(page), vmaddr);
100} 117}
101 118
102#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
103void flush_kernel_dcache_page_addr(void *addr);
104static inline void flush_kernel_dcache_page(struct page *page)
105{
106 flush_kernel_dcache_page_addr(page_address(page));
107}
108
109#ifdef CONFIG_DEBUG_RODATA 119#ifdef CONFIG_DEBUG_RODATA
110void mark_rodata_ro(void); 120void mark_rodata_ro(void);
111#endif 121#endif
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c
index d7d94b845dc2..3948f1dd455a 100644
--- a/arch/parisc/kernel/irq.c
+++ b/arch/parisc/kernel/irq.c
@@ -108,7 +108,7 @@ int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)
108 int cpu_dest; 108 int cpu_dest;
109 109
110 /* timer and ipi have to always be received on all CPUs */ 110 /* timer and ipi have to always be received on all CPUs */
111 if (CHECK_IRQ_PER_CPU(irq)) { 111 if (CHECK_IRQ_PER_CPU(irq_to_desc(irq)->status)) {
112 /* Bad linux design decision. The mask has already 112 /* Bad linux design decision. The mask has already
113 * been set; we must reset it */ 113 * been set; we must reset it */
114 cpumask_setall(irq_desc[irq].affinity); 114 cpumask_setall(irq_desc[irq].affinity);