diff options
-rw-r--r-- | arch/parisc/include/asm/cacheflush.h | 24 | ||||
-rw-r--r-- | arch/parisc/kernel/irq.c | 2 |
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); | |||
35 | void flush_cache_all(void); | 35 | void flush_cache_all(void); |
36 | void flush_cache_mm(struct mm_struct *mm); | 36 | void flush_cache_mm(struct mm_struct *mm); |
37 | 37 | ||
38 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | ||
39 | void flush_kernel_dcache_page_addr(void *addr); | ||
40 | static 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 | } |
49 | static inline void invalidate_kernel_vmap_range(void *vaddr, int size) | 56 | static 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 | ||
103 | void flush_kernel_dcache_page_addr(void *addr); | ||
104 | static 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 |
110 | void mark_rodata_ro(void); | 120 | void 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); |