787b2faadc
On ARM, update_mmu_cache() does dcache flush for a page only if it has a kernel mapping (page_mapping(page) != NULL). The correct behavior would be to force the flush based on dcache_dirty bit only. One of the cases where present logic would be a problem is when a RAM based block device[1] is used as a swap disk. In this case, we would have in-memory data corruption as shown in steps below: do_swap_page() { - Allocate a new page (if not already in swap cache) - Issue read from swap disk - Block driver issues flush_dcache_page() - flush_dcache_page() simply sets PG_dcache_dirty bit and does not actually issue a flush since this page has no user space mapping yet. - Now, if swap disk is almost full, this newly read page is removed from swap cache and corrsponding swap slot is freed. - Map this page anonymously in user space. - update_mmu_cache() - Since this page does not have kernel mapping (its not in page/swap cache and is mapped anonymously), it does not issue dcache flush even if dcache_dirty bit is set by flush_dcache_page() above. <user now gets stale data since dcache was never flushed> } Same problem exists on mips too. [1] example: - brd (RAM based block device) - ramzswap (RAM based compressed swap device) Signed-off-by: Nitin Gupta <ngupta@vflare.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
||
---|---|---|
.. | ||
boot | ||
common | ||
configs | ||
include/asm | ||
kernel | ||
lib | ||
mach-aaec2000 | ||
mach-at91 | ||
mach-bcmring | ||
mach-clps711x | ||
mach-davinci | ||
mach-ebsa110 | ||
mach-ep93xx | ||
mach-footbridge | ||
mach-gemini | ||
mach-h720x | ||
mach-integrator | ||
mach-iop13xx | ||
mach-iop32x | ||
mach-iop33x | ||
mach-ixp4xx | ||
mach-ixp23xx | ||
mach-ixp2000 | ||
mach-kirkwood | ||
mach-ks8695 | ||
mach-l7200 | ||
mach-lh7a40x | ||
mach-loki | ||
mach-mmp | ||
mach-msm | ||
mach-mv78xx0 | ||
mach-mx1 | ||
mach-mx2 | ||
mach-mx3 | ||
mach-mx25 | ||
mach-mxc91231 | ||
mach-netx | ||
mach-nomadik | ||
mach-ns9xxx | ||
mach-omap1 | ||
mach-omap2 | ||
mach-orion5x | ||
mach-pnx4008 | ||
mach-pxa | ||
mach-realview | ||
mach-rpc | ||
mach-s3c24a0/include/mach | ||
mach-s3c2400 | ||
mach-s3c2410 | ||
mach-s3c2412 | ||
mach-s3c2440 | ||
mach-s3c2442 | ||
mach-s3c2443 | ||
mach-s3c6400 | ||
mach-s3c6410 | ||
mach-s5pc100 | ||
mach-sa1100 | ||
mach-shark | ||
mach-stmp37xx | ||
mach-stmp378x | ||
mach-u300 | ||
mach-versatile | ||
mach-w90x900 | ||
mm | ||
nwfpe | ||
oprofile | ||
plat-iop | ||
plat-mxc | ||
plat-omap | ||
plat-orion | ||
plat-pxa | ||
plat-s3c | ||
plat-s3c24xx | ||
plat-s3c64xx | ||
plat-s5pc1xx | ||
plat-stmp3xxx | ||
tools | ||
vfp | ||
Kconfig | ||
Kconfig-nommu | ||
Kconfig.debug | ||
Makefile |