linux/arch
Nitin Gupta 787b2faadc ARM: force dcache flush if dcache_dirty bit set
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>
2009-10-12 17:52:26 +01:00
..
alpha alpha: Fix duplicate <asm/thread_info.h> include 2009-09-27 14:46:05 -07:00
arm ARM: force dcache flush if dcache_dirty bit set 2009-10-12 17:52:26 +01:00
avr32 Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next 2009-09-23 15:37:02 -07:00
blackfin headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
cris const: constify remaining file_operations 2009-10-01 16:11:11 -07:00
frv FRV: Flash mappings for the MB93090-MB00 motherboard 2009-09-24 17:18:38 -07:00
h8300 h8300: Cleanup linker script using new linker script macros. 2009-09-24 17:16:22 -07:00
ia64 const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
m32r headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
m68k revert "m68k: convert to asm-generic/hardirq.h" 2009-10-01 16:11:11 -07:00
m68knommu m68knommu: fix rename of pt_regs offset defines breakage 2009-09-30 10:06:07 +10:00
microblaze microblaze: Clear sticky FSR register after saving it to func parametr 2009-10-05 11:37:47 +02:00
mips MIPS: Avoid spurious make includecheck message 2009-09-30 21:47:02 +02:00
mn10300 mn10300: fix kernel build failures when using gcc-4.x 2009-10-01 16:11:12 -07:00
parisc parisc: Fix linker script breakage. 2009-09-28 00:25:07 -04:00
powerpc const: constify remaining file_operations 2009-10-01 16:11:11 -07:00
s390 [S390] Add EX_TABLE for addressing exception in usercopy functions. 2009-10-06 10:35:10 +02:00
score Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next 2009-09-23 15:37:02 -07:00
sh sh: Don't allocate smaller sized mappings on every iteration 2009-10-09 11:26:35 +09:00
sparc Merge branch 'sparc-perf-events-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-10-08 12:05:50 -07:00
um headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
x86 pci: increase alignment to make more space for hidden code 2009-10-11 14:43:36 -07:00
xtensa headers: remove sched.h from interrupt.h 2009-10-11 11:20:58 -07:00
.gitignore
Kconfig oprofile: fix oprofile regression: select RING_BUFFER_ALLOW_SWAP 2009-09-17 15:53:42 -04:00