kernel_optimize_test/arch/mips/mm
Lars Persson 4d46a67a3e MIPS: Fix race condition in lazy cache flushing.
The lazy cache flushing implemented in the MIPS kernel suffers from a
race condition that is exposed by do_set_pte() in mm/memory.c.

A pre-condition is a file-system that writes to the page from the CPU
in its readpage method and then calls flush_dcache_page(). One example
is ubifs. Another pre-condition is that the dcache flush is postponed
in __flush_dcache_page().

Upon a page fault for an executable mapping not existing in the
page-cache, the following will happen:
1. Write to the page
2. flush_dcache_page
3. flush_icache_page
4. set_pte_at
5. update_mmu_cache (commits the flush of a dcache-dirty page)

Between steps 4 and 5 another thread can hit the same page and it will
encounter a valid pte. Because the data still is in the L1 dcache the CPU
will fetch stale data from L2 into the icache and execute garbage.

This fix moves the commit of the cache flush to step 3 to close the
race window. It also reduces the amount of flushes on non-executable
mappings because we never enter __flush_dcache_page() for non-aliasing
CPUs.

Regressions can occur in drivers that mistakenly relies on the
flush_dcache_page() in get_user_pages() for DMA operations.

[ralf@linux-mips.org: Folded in patch 9346 to fix highmem issue.]

Signed-off-by: Lars Persson <larper@axis.com>
Cc: linux-mips@linux-mips.org
Cc: paul.burton@imgtec.com
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/9346/
Patchwork: https://patchwork.linux-mips.org/patch/9738/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2015-03-25 13:48:00 +01:00
..
c-octeon.c MIPS: Call find_vma with the mmap_sem held 2014-06-03 22:19:09 +02:00
c-r3k.c mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
c-r4k.c MIPS: mm: scache: Add secondary cache support for MIPS R6 cores 2015-02-17 15:37:31 +00:00
c-tx39.c
cache.c MIPS: Fix race condition in lazy cache flushing. 2015-03-25 13:48:00 +01:00
cerr-sb1.c
cex-gen.S
cex-oct.S
cex-sb1.S mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
dma-default.c MIPS: DMA: Explain the lack of special handling for R14000/R16000. 2014-11-24 07:45:08 +01:00
extable.c
fault.c Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2015-02-21 19:41:38 -08:00
gup.c mm: gup: use get_user_pages_unlocked within get_user_pages_fast 2015-02-11 17:06:05 -08:00
highmem.c
hugetlbpage.c mm/hugetlb: reduce arch dependent code around follow_huge_* 2015-02-11 17:06:01 -08:00
init.c MIPS: Add support for XPA. 2015-03-19 17:39:49 +01:00
ioremap.c MIPS: Replace use of phys_t with phys_addr_t. 2014-11-24 22:47:31 +01:00
Makefile MIPS: mm: Only build one microassembler that is suitable 2014-11-24 07:45:36 +01:00
mmap.c
page-funcs.S
page.c MIPS: mm: page: Add MIPS R6 support 2015-02-17 15:37:30 +00:00
pgtable-32.c
pgtable-64.c
sc-ip22.c
sc-mips.c MIPS: mm: scache: Add secondary cache support for MIPS R6 cores 2015-02-17 15:37:31 +00:00
sc-r5k.c MIPS: Remove useless parentheses 2014-11-24 07:44:49 +01:00
sc-rm7k.c mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
tlb-funcs.S MIPS: mm: Fix broken microMIPS kernel regression. 2014-05-14 18:11:06 +02:00
tlb-r3k.c MIPS: Remove incorrect NULL check in local_flush_tlb_page() 2014-07-30 20:59:43 +02:00
tlb-r4k.c MIPS: Add support for XPA. 2015-03-19 17:39:49 +01:00
tlb-r8k.c mips: delete non-required instances of include <linux/init.h> 2014-01-24 22:39:56 +01:00
tlbex-fault.S
tlbex.c MIPS: Add support for XPA. 2015-03-19 17:39:49 +01:00
uasm-micromips.c MIPS: mm: Remove dead macro definitions 2015-02-20 23:42:00 +01:00
uasm-mips.c MIPS: mm: Remove dead macro definitions 2015-02-20 23:42:00 +01:00
uasm.c MIPS: OCTEON: Implement DCache errata workaround for all CN6XXX 2015-02-20 15:31:27 +01:00