linux-mips
[Top] [All Lists]

[PATCH] mips/ide: flush dcache also if icache does not snoop dcache

To: linux-mips@linux-mips.org, debian-mips@lists.debian.org
Subject: [PATCH] mips/ide: flush dcache also if icache does not snoop dcache
From: Andreas Barth <aba@not.so.argh.org>
Date: Thu, 6 Oct 2011 09:55:00 +0200
Cc: sebastian@breakpoint.cc
Mail-followup-to: Andreas Barth <aba@not.so.argh.org>, linux-mips@linux-mips.org, debian-mips@lists.debian.org, sebastian@breakpoint.cc
Sender: linux-mips-bounce@linux-mips.org
User-agent: Mutt/1.5.18 (2008-05-17)
Hi,

we apply this patch in Debian for quite some time (the linked bug
report is available on http://bugs.debian.org/404951 ). There was some
discussion about it in http://comments.gmane.org/gmane.linux.ide/45092
but not concluded (or at least: the patch is not merged).

In case it's useful it should IMHO go upstream. In case anything
should be fixed we should fix whatever is necessary. (I don't have
any own opinion with the patch, except that I want to get patches
merged as far as useful.)

So, my question is: Anything that needs to be changed? Or should we
just continue the situation as is?


Regards,
Andi


From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Subject: mips/ide: flush dcache also if icache does not snoop dcache

If this is not done then the new just read data which remains in dcache
will not make it into icache on time. Thus the CPU loads invalid data
and executes crap. The result is that the user is not able to execute
anything from its IDE based media while reading plain data is still
working well.
This problem has been reported as Debian #404951.

Cc: stable@kernel.org
Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
---
 arch/mips/include/asm/mach-generic/ide.h |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/mips/include/asm/mach-generic/ide.h 
b/arch/mips/include/asm/mach-generic/ide.h
index 9c93a5b..e80e47f 100644
--- a/arch/mips/include/asm/mach-generic/ide.h
+++ b/arch/mips/include/asm/mach-generic/ide.h
@@ -23,7 +23,7 @@
 static inline void __ide_flush_prologue(void)
 {
 #ifdef CONFIG_SMP
-       if (cpu_has_dc_aliases)
+       if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
                preempt_disable();
 #endif
 }
@@ -31,14 +31,14 @@ static inline void __ide_flush_prologue(void)
 static inline void __ide_flush_epilogue(void)
 {
 #ifdef CONFIG_SMP
-       if (cpu_has_dc_aliases)
+       if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
                preempt_enable();
 #endif
 }
 
 static inline void __ide_flush_dcache_range(unsigned long addr, unsigned long 
size)
 {
-       if (cpu_has_dc_aliases) {
+       if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) {
                unsigned long end = addr + size;
 
                while (addr < end) {

<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH] mips/ide: flush dcache also if icache does not snoop dcache, Andreas Barth <=