Lars Persson
d2b2c6dd22
mm/migrate.c: add missing flush_dcache_page for non-mapped page migrate
...
Our MIPS 1004Kc SoCs were seeing random userspace crashes with SIGILL
and SIGSEGV that could not be traced back to a userspace code bug. They
had all the magic signs of an I/D cache coherency issue.
Now recently we noticed that the /proc/sys/vm/compact_memory interface
was quite efficient at provoking this class of userspace crashes.
Studying the code in mm/migrate.c there is a distinction made between
migrating a page that is mapped at the instant of migration and one that
is not mapped. Our problem turned out to be the non-mapped pages.
For the non-mapped page the code performs a copy of the page content and
all relevant meta-data of the page without doing the required D-cache
maintenance. This leaves dirty data in the D-cache of the CPU and on
the 1004K cores this data is not visible to the I-cache. A subsequent
page-fault that triggers a mapping of the page will happily serve the
process with potentially stale code.
What about ARM then, this bug should have seen greater exposure? Well
ARM became immune to this flaw back in 2010, see commit c01778001a
("ARM: 6379/1: Assume new page cache pages have dirty D-cache").
My proposed fix moves the D-cache maintenance inside move_to_new_page to
make it common for both cases.
Link: http://lkml.kernel.org/r/20190315083502.11849-1-larper@axis.com
Fixes: 97ee052461 ("flush cache before installing new page at migraton")
Signed-off-by: Lars Persson <larper@axis.com>
Reviewed-by: Paul Burton <paul.burton@mips.com>
Acked-by: Mel Gorman <mgorman@techsingularity.net>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2019-03-29 10:01:37 -07:00
..
kasan
kasan: fix variable 'tag' set but not used warning
2019-03-29 10:01:36 -07:00
backing-dev.c
writeback: synchronize sync(2) against cgroup writeback membership switches
2019-01-22 14:39:38 -07:00
balloon_compaction.c
cleancache.c
cma.c
memblock: emphasize that memblock_alloc_range() returns a physical address
2019-03-12 10:04:01 -07:00
cma.h
cma_debug.c
mm/cma_debug.c: remove static scoped cma_debugfs_root
2019-03-05 21:07:20 -08:00
compaction.c
mm/compaction: pass pgdat to too_many_isolated() instead of zone
2019-03-05 21:07:21 -08:00
debug.c
mm/debug.c: fix __dump_page when mapping->host is not set
2019-03-29 10:01:37 -07:00
debug_page_ref.c
dmapool.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
early_ioremap.c
fadvise.c
failslab.c
mm: no need to check return value of debugfs_create functions
2019-03-05 21:07:17 -08:00
filemap.c
filemap: add a comment about FAULT_FLAG_RETRY_NOWAIT behavior
2019-03-15 11:26:07 -07:00
frame_vector.c
frontswap.c
gup.c
Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2019-03-07 17:43:58 -08:00
gup_benchmark.c
mm: no need to check return value of debugfs_create functions
2019-03-05 21:07:17 -08:00
highmem.c
mm: convert totalram_pages and totalhigh_pages variables to atomic
2018-12-28 12:11:47 -08:00
hmm.c
mm/hmm: convert to use vm_fault_t
2019-03-12 10:04:00 -07:00
huge_memory.c
mm/huge_memory.c: fix "orig_pud" set but not used
2019-03-05 21:07:21 -08:00
hugetlb.c
mm: update get_user_pages_longterm to migrate pages allocated from CMA region
2019-03-05 21:07:19 -08:00
hugetlb_cgroup.c
hwpoison-inject.c
init-mm.c
internal.h
mm, compaction: capture a page under direct compaction
2019-03-05 21:07:17 -08:00
interval_tree.c
Kconfig
ksm: replace jhash2 with xxhash
2018-12-28 12:11:46 -08:00
Kconfig.debug
mm/page_owner: move config option to mm/Kconfig.debug
2019-03-05 21:07:18 -08:00
khugepaged.c
mm: memcontrol: expose THP events on a per-memcg basis
2019-03-05 21:07:19 -08:00
kmemleak-test.c
kmemleak.c
kmemleak: account for tagged pointers when calculating pointer range
2019-02-21 09:01:00 -08:00
ksm.c
mm: ksm: do not block on page lock when searching stable tree
2019-03-05 21:07:19 -08:00
list_lru.c
numa: make "nr_node_ids" unsigned int
2019-03-05 21:07:19 -08:00
maccess.c
Revert "x86/fault: BUG() when uaccess helpers fault on kernel addresses"
2019-02-25 09:10:51 -08:00
madvise.c
mm/mmu_notifier: use structure for invalidate_range_start/end calls v2
2018-12-28 12:11:50 -08:00
Makefile
mm: remove nobootmem
2018-10-31 08:54:16 -07:00
memblock.c
mm: memblock: update comments and kernel-doc
2019-03-12 10:04:02 -07:00
memcontrol.c
mm/memcontrol.c: fix bad line in comment
2019-03-05 21:07:21 -08:00
memfd.c
mm/memfd: add an F_SEAL_FUTURE_WRITE seal to memfd
2019-03-05 21:07:19 -08:00
memory-failure.c
mm: hwpoison: fix thp split handing in soft_offline_in_use_page()
2019-03-05 21:07:13 -08:00
memory.c
mm/memory.c: fix modifying of page protection by insert_pfn()
2019-03-29 10:01:37 -07:00
memory_hotplug.c
mm/memory_hotplug.c: fix notification in offline error path
2019-03-29 10:01:37 -07:00
mempolicy.c
mm: mempolicy: make mbind() return -EIO when MPOL_MF_STRICT is specified
2019-03-29 10:01:37 -07:00
mempool.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
memtest.c
migrate.c
mm/migrate.c: add missing flush_dcache_page for non-mapped page migrate
2019-03-29 10:01:37 -07:00
mincore.c
Revert "Change mincore() to count "mapped" pages rather than "cached" pages"
2019-01-24 09:04:37 +13:00
mlock.c
mm: remove zone_lru_lock() function, access ->lru_lock directly
2019-03-05 21:07:21 -08:00
mm_init.c
mm: convert totalram_pages and totalhigh_pages variables to atomic
2018-12-28 12:11:47 -08:00
mmap.c
mm: fix some typos in mm directory
2019-03-05 21:07:18 -08:00
mmu_context.c
mmu_gather.c
mm: Replace call_rcu_sched() with call_rcu()
2018-11-27 09:21:46 -08:00
mmu_notifier.c
mm/mmu_notifier: use structure for invalidate_range_start/end calls v2
2018-12-28 12:11:50 -08:00
mmzone.c
mprotect.c
mm: update ptep_modify_prot_commit to take old pte value as arg
2019-03-05 21:07:18 -08:00
mremap.c
mm,mremap: bail out earlier in mremap_to under map pressure
2019-03-05 21:07:21 -08:00
msync.c
nommu.c
oom_kill.c
mm,oom: don't kill global init via memory.oom.group
2019-03-05 21:07:19 -08:00
page-writeback.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
page_alloc.c
mm/hotplug: fix offline undo_isolate_page_range()
2019-03-29 10:01:37 -07:00
page_counter.c
page_ext.c
memblock: drop memblock_alloc_*_nopanic() variants
2019-03-12 10:04:02 -07:00
page_idle.c
mm: remove zone_lru_lock() function, access ->lru_lock directly
2019-03-05 21:07:21 -08:00
page_io.c
mm/page_io.c: fix polled swap page in
2019-01-04 13:13:48 -08:00
page_isolation.c
mm/page_isolation.c: fix a wrong flag in set_migratetype_isolate()
2019-03-29 10:01:37 -07:00
page_owner.c
mm: no need to check return value of debugfs_create functions
2019-03-05 21:07:17 -08:00
page_poison.c
page_poison: play nicely with KASAN
2019-03-05 21:07:13 -08:00
page_vma_mapped.c
mm/rmap: map_pte() was not handling private ZONE_DEVICE page properly
2018-10-31 08:54:11 -07:00
pagewalk.c
percpu-internal.h
percpu-km.c
percpu: km: no need to consider pcpu_group_offsets[0]
2019-02-26 13:47:58 -08:00
percpu-stats.c
percpu-vm.c
percpu.c
memblock: drop memblock_alloc_*_nopanic() variants
2019-03-12 10:04:02 -07:00
pgtable-generic.c
process_vm_access.c
quicklist.c
readahead.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
rmap.c
mm: remove zone_lru_lock() function, access ->lru_lock directly
2019-03-05 21:07:21 -08:00
rodata_test.c
shmem.c
mm/memfd: add an F_SEAL_FUTURE_WRITE seal to memfd
2019-03-05 21:07:19 -08:00
slab.c
mm: add support for kmem caches in DMA32 zone
2019-03-29 10:01:37 -07:00
slab.h
mm: add support for kmem caches in DMA32 zone
2019-03-29 10:01:37 -07:00
slab_common.c
mm: add support for kmem caches in DMA32 zone
2019-03-29 10:01:37 -07:00
slob.c
slub.c
mm: add support for kmem caches in DMA32 zone
2019-03-29 10:01:37 -07:00
sparse-vmemmap.c
mm: remove include/linux/bootmem.h
2018-10-31 08:54:16 -07:00
sparse.c
mm/hotplug: fix offline undo_isolate_page_range()
2019-03-29 10:01:37 -07:00
swap.c
mm: remove zone_lru_lock() function, access ->lru_lock directly
2019-03-05 21:07:21 -08:00
swap_cgroup.c
swap_slots.c
swap_state.c
mm: swap: add comment for swap_vma_readahead
2019-03-05 21:07:16 -08:00
swapfile.c
mm/swapfile.c: use struct_size() in kvzalloc()
2019-03-05 21:07:21 -08:00
truncate.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
usercopy.c
mm/usercopy.c: no check page span for stack objects
2019-01-08 17:15:11 -08:00
userfaultfd.c
hugetlbfs: revert "use i_mmap_rwsem for more pmd sharing synchronization"
2019-01-08 17:15:11 -08:00
util.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
vmacache.c
vmalloc.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
vmpressure.c
vmscan.c
mm: remove zone_lru_lock() function, access ->lru_lock directly
2019-03-05 21:07:21 -08:00
vmstat.c
mm: no need to check return value of debugfs_create functions
2019-03-05 21:07:17 -08:00
workingset.c
mm/workingset: remove unused @mapping argument in workingset_eviction()
2019-03-05 21:07:21 -08:00
z3fold.c
z3fold: fix possible reclaim races
2018-11-18 10:15:09 -08:00
zbud.c
zpool.c
zsmalloc.c
zswap.c
mm: convert totalram_pages and totalhigh_pages variables to atomic
2018-12-28 12:11:47 -08:00