summaryrefslogtreecommitdiff
path: root/arch/sh/mm/cache-sh7705.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2009-09-01 21:12:55 +0900
committerPaul Mundt <lethal@linux-sh.org>2009-09-01 21:12:55 +0900
commit983f4c514c4c9ddac1077a2c805fd16cbe3f7487 (patch)
treec0fac3c691139178c545ebe7a8f8eb642937f163 /arch/sh/mm/cache-sh7705.c
parentade315d83c1d53b3c6b820134cb16601351810fe (diff)
downloadkernel-common-983f4c514c4c9ddac1077a2c805fd16cbe3f7487.tar.gz
kernel-common-983f4c514c4c9ddac1077a2c805fd16cbe3f7487.tar.bz2
kernel-common-983f4c514c4c9ddac1077a2c805fd16cbe3f7487.zip
Revert "sh: Kill off now redundant local irq disabling."
This reverts commit 64a6d72213dd810dd55bd0a503c36150af41c3c3. Unfortunately we can't use on_each_cpu() for all of the cache ops, as some of them only require preempt disabling. This seems to be the same issue that impacts the mips r4k caches, where this code was based on. This fixes up a deadlock that showed up in some IRQ context cases. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/mm/cache-sh7705.c')
-rw-r--r--arch/sh/mm/cache-sh7705.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/sh/mm/cache-sh7705.c b/arch/sh/mm/cache-sh7705.c
index 9dc38660e3de..6293f57fa888 100644
--- a/arch/sh/mm/cache-sh7705.c
+++ b/arch/sh/mm/cache-sh7705.c
@@ -81,6 +81,7 @@ static void sh7705_flush_icache_range(void *args)
static void __flush_dcache_page(unsigned long phys)
{
unsigned long ways, waysize, addrstart;
+ unsigned long flags;
phys |= SH_CACHE_VALID;
@@ -97,6 +98,7 @@ static void __flush_dcache_page(unsigned long phys)
* potential cache aliasing, therefore the optimisation is probably not
* possible.
*/
+ local_irq_save(flags);
jump_to_uncached();
ways = current_cpu_data.dcache.ways;
@@ -124,6 +126,7 @@ static void __flush_dcache_page(unsigned long phys)
} while (--ways);
back_to_cached();
+ local_irq_restore(flags);
}
/*
@@ -142,9 +145,14 @@ static void sh7705_flush_dcache_page(void *page)
static void sh7705_flush_cache_all(void *args)
{
+ unsigned long flags;
+
+ local_irq_save(flags);
jump_to_uncached();
+
cache_wback_all();
back_to_cached();
+ local_irq_restore(flags);
}
/*