Oscar Salvador
ea2c3f6f55
mm,mremap: bail out earlier in mremap_to under map pressure
...
When using mremap() syscall in addition to MREMAP_FIXED flag, mremap()
calls mremap_to() which does the following:
1) unmaps the destination region where we are going to move the map
2) If the new region is going to be smaller, we unmap the last part
of the old region
Then, we will eventually call move_vma() to do the actual move.
move_vma() checks whether we are at least 4 maps below max_map_count
before going further, otherwise it bails out with -ENOMEM. The problem
is that we might have already unmapped the vma's in steps 1) and 2), so
it is not possible for userspace to figure out the state of the vmas
after it gets -ENOMEM, and it gets tricky for userspace to clean up
properly on error path.
While it is true that we can return -ENOMEM for more reasons (e.g: see
may_expand_vm() or move_page_tables()), I think that we can avoid this
scenario if we check early in mremap_to() if the operation has high
chances to succeed map-wise.
Should that not be the case, we can bail out before we even try to unmap
anything, so we make sure the vma's are left untouched in case we are
likely to be short of maps.
The thumb-rule now is to rely on the worst-scenario case we can have.
That is when both vma's (old region and new region) are going to be
split in 3, so we get two more maps to the ones we already hold (one per
each). If current map count + 2 maps still leads us to 4 maps below the
threshold, we are going to pass the check in move_vma().
Of course, this is not free, as it might generate false positives when
it is true that we are tight map-wise, but the unmap operation can
release several vma's leading us to a good state.
Another approach was also investigated [1], but it may be too much
hassle for what it brings.
[1] https://lore.kernel.org/lkml/20190219155320.tkfkwvqk53tfdojt@d104.suse.de/
Link: http://lkml.kernel.org/r/20190226091314.18446-1-osalvador@suse.de
Signed-off-by: Oscar Salvador <osalvador@suse.de>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
Cc: Yang Shi <yang.shi@linux.alibaba.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2019-03-05 21:07:21 -08:00
..
kasan
kasan: fix coccinelle warnings in kasan_p*_table
2019-03-05 21:07:13 -08: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
mm/cma.c: cma_declare_contiguous: correct err handling
2019-03-05 21:07:21 -08: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() for poisoned pages
2019-02-21 09:01:00 -08: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
vfs: implement readahead(2) using POSIX_FADV_WILLNEED
2018-08-30 20:01:32 +02:00
failslab.c
mm: no need to check return value of debugfs_create functions
2019-03-05 21:07:17 -08:00
filemap.c
mm: remove zone_lru_lock() function, access ->lru_lock directly
2019-03-05 21:07:21 -08:00
frame_vector.c
frontswap.c
gup.c
mm: update get_user_pages_longterm to migrate pages allocated from CMA region
2019-03-05 21:07:19 -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: fix memremap.h, move dev_page_fault_t callback to hmm
2018-12-28 12:11:52 -08: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
mm: Allocate the mm_cpumask (mm->cpu_bitmap[]) dynamically based on nr_cpu_ids
2018-07-17 09:35:30 +02:00
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: no need to check return value of debugfs_create functions
2019-03-05 21:07:17 -08: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: do_fault: avoid usage of stale vm_area_struct
2019-03-05 21:07:21 -08:00
memory_hotplug.c
mm/hotplug: fix an imbalance with DEBUG_PAGEALLOC
2019-03-05 21:07:21 -08:00
mempolicy.c
mm, mempolicy: fix uninit memory access
2019-03-05 21:07:18 -08: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: cleanup expected_page_refs()
2019-03-05 21:07:20 -08: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
mm/gup: cache dev_pagemap while pinning pages
2018-10-26 16:38:15 -07:00
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: unexport free_reserved_area
2019-03-05 21:07:20 -08:00
page_counter.c
page_ext.c
mm/page_ext.c: fix an imbalance with kmemleak
2019-03-05 21:07:21 -08: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: only report isolation failures when offlining memory
2018-12-28 12:11:46 -08: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: convert spin_lock_irq to spin_lock_irqsave.
2018-12-18 09:04:08 -08:00
percpu-stats.c
percpu-vm.c
percpu.c
Merge branch 'for-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu
2018-11-01 09:27:57 -07:00
pgtable-generic.c
x86/mm: Page size aware flush_tlb_mm_range()
2018-10-09 16:51:11 +02:00
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
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
slab.h
memcg: localize memcg_kmem_enabled() check
2019-03-05 21:07:15 -08:00
slab_common.c
docs/core-api/mm: fix return value descriptions in mm/
2019-03-05 21:07:20 -08:00
slob.c
slub.c
numa: make "nr_node_ids" unsigned int
2019-03-05 21:07:19 -08:00
sparse-vmemmap.c
mm: remove include/linux/bootmem.h
2018-10-31 08:54:16 -07:00
sparse.c
mm/sparse: fix a bad comparison
2019-03-05 21:07:21 -08: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
mm, swap, get_swap_pages: use entry_size instead of cluster in parameter
2018-08-22 10:52:44 -07:00
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
mm: get rid of vmacache_flush_all() entirely
2018-09-13 15:18:04 -10:00
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
mm/zsmalloc.c: fix fall-through annotation
2018-10-26 16:26:35 -07:00
zswap.c
mm: convert totalram_pages and totalhigh_pages variables to atomic
2018-12-28 12:11:47 -08:00