linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ARM: cache-v7: Disable preemption when reading CCSIDR
@ 2012-02-02 19:24 Stephen Boyd
  2012-02-02 20:44 ` Russell King - ARM Linux
  0 siblings, 1 reply; 25+ messages in thread
From: Stephen Boyd @ 2012-02-02 19:24 UTC (permalink / raw)
  To: linux-arm-kernel

armv7's flush_cache_all() flushes caches via set/way. To
determine the cache attributes (line size, number of sets,
etc.) the assembly first writes the CSSELR register to select a
cache level and then reads the CCSIDR register. The CSSELR register
is banked per-cpu and is used to determine which cache level CCSIDR
reads. If the task is migrated between when the CSSELR is written and
the CCSIDR is read the CCSIDR value may be for an unexpected cache
level (for example L1 instead of L2) and incorrect cache flushing
could occur.

Disable preemption across the write and read so that the correct
cache attributes are read and used for the cache flushing
routine. This fixes a problem we see in scm_call() when
flush_cache_all() is called from preemptible context and
sometimes the L2 cache is not properly flushed out.

Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
---

Should we move get_thread_info into assembler.h? It seems odd
to include entry-header.S but I saw that vfp was doing the same.

 arch/arm/mm/cache-v7.S |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
index 07c4bc8..a033858 100644
--- a/arch/arm/mm/cache-v7.S
+++ b/arch/arm/mm/cache-v7.S
@@ -16,6 +16,7 @@
 #include <asm/unwind.h>
 
 #include "proc-macros.S"
+#include "../kernel/entry-header.S"
 
 /*
  *	v7_flush_icache_all()
@@ -54,9 +55,19 @@ loop1:
 	and	r1, r1, #7			@ mask of the bits for current cache only
 	cmp	r1, #2				@ see what cache we have at this level
 	blt	skip				@ skip if no cache, or just i-cache
+#ifdef CONFIG_PREEMPT
+	get_thread_info r9
+	ldr	r11, [r9, #TI_PREEMPT]		@ get preempt count
+	add	r11, r11, #1			@ increment it
+	str	r11, [r9, #TI_PREEMPT]
+#endif
 	mcr	p15, 2, r10, c0, c0, 0		@ select current cache level in cssr
 	isb					@ isb to sych the new cssr&csidr
 	mrc	p15, 1, r1, c0, c0, 0		@ read the new csidr
+#ifdef CONFIG_PREEMPT
+	sub	r11, r11, #1			@ decrement preempt count
+	str	r11, [r9, #TI_PREEMPT]
+#endif
 	and	r2, r1, #7			@ extract the length of the cache lines
 	add	r2, r2, #4			@ add 4 (line length offset)
 	ldr	r4, =0x3ff
-- 
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.

^ permalink raw reply related	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2012-02-14 18:07 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-02 19:24 [PATCH] ARM: cache-v7: Disable preemption when reading CCSIDR Stephen Boyd
2012-02-02 20:44 ` Russell King - ARM Linux
2012-02-02 21:38   ` Nicolas Pitre
2012-02-02 23:36     ` Stephen Boyd
2012-02-03  0:36       ` Russell King - ARM Linux
2012-02-03  0:49         ` Stephen Boyd
2012-02-03  1:18           ` Nicolas Pitre
2012-02-03  2:03             ` Stephen Boyd
2012-02-03  2:35               ` Nicolas Pitre
2012-02-03  2:37                 ` Stephen Boyd
2012-02-03  3:04                   ` Nicolas Pitre
2012-02-03 11:15                     ` Sergei Shtylyov
2012-02-04 18:00               ` Catalin Marinas
2012-02-13 17:54               ` Rabin Vincent
2012-02-13 18:09                 ` Nicolas Pitre
2012-02-13 18:13                   ` Stephen Boyd
2012-02-13 18:15                     ` Russell King - ARM Linux
2012-02-13 22:23                       ` Stephen Boyd
2012-02-13 23:29                         ` Russell King - ARM Linux
2012-02-14 14:15                           ` Rabin Vincent
2012-02-14 17:30                             ` Nicolas Pitre
2012-02-14 18:07                             ` Stephen Boyd
2012-02-03  1:16         ` Nicolas Pitre
2012-02-07  3:34         ` Saravana Kannan
2012-02-07 17:42           ` Stephen Boyd

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).