[ARM] 5366/1: fix shared memory coherency with VIVT L1 + L2 caches
authorNicolas Pitre <nico@cam.org>
Fri, 16 Jan 2009 22:02:54 +0000 (23:02 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 28 Jan 2009 16:55:00 +0000 (16:55 +0000)
commit08e445bd6a98fa09befe0cf6d67705324f913fc6
tree34308727da79a6a36fc52ebe5b5d960b2bafaf6d
parentecbab71c521819716e204659dfe72fc39d00630a
[ARM] 5366/1: fix shared memory coherency with VIVT L1 + L2 caches

When there are multiple L1-aliasing userland mappings of the same physical
page, we currently remap each of them uncached, to prevent VIVT cache
aliasing issues. (E.g. writes to one of the mappings not being immediately
visible via another mapping.)  However, when we do this remapping, there
could still be stale data in the L2 cache, and an uncached mapping might
bypass L2 and go straight to RAM.  This would cause reads from such
mappings to see old data (until the dirty L2 line is eventually evicted.)

This issue is solved by forcing a L2 cache flush whenever the shared page
is made L1 uncacheable.

Ideally, we would make L1 uncacheable and L2 cacheable as L2 is PIPT. But
Feroceon does not support that combination, and the TEX=5 C=0 B=0 encoding
for XSc3 doesn't appear to work in practice.

Signed-off-by: Nicolas Pitre <nico@marvell.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/fault-armv.c