android_kernel_samsung_sm8650/mm
Charan Teja Kalla 5dd0c4814f UPSTREAM: mm: page_alloc: unreserve highatomic page blocks before oom
__alloc_pages_direct_reclaim() is called from slowpath allocation where
high atomic reserves can be unreserved after there is a progress in
reclaim and yet no suitable page is found.  Later should_reclaim_retry()
gets called from slow path allocation to decide if the reclaim needs to be
retried before OOM kill path is taken.

should_reclaim_retry() checks the available(reclaimable + free pages)
memory against the min wmark levels of a zone and returns:

a) true, if it is above the min wmark so that slow path allocation will
   do the reclaim retries.

b) false, thus slowpath allocation takes oom kill path.

should_reclaim_retry() can also unreserves the high atomic reserves **but
only after all the reclaim retries are exhausted.**

In a case where there are almost none reclaimable memory and free pages
contains mostly the high atomic reserves but allocation context can't use
these high atomic reserves, makes the available memory below min wmark
levels hence false is returned from should_reclaim_retry() leading the
allocation request to take OOM kill path.  This can turn into a early oom
kill if high atomic reserves are holding lot of free memory and
unreserving of them is not attempted.

(early)OOM is encountered on a VM with the below state:
[  295.998653] Normal free:7728kB boost:0kB min:804kB low:1004kB
high:1204kB reserved_highatomic:8192KB active_anon:4kB inactive_anon:0kB
active_file:24kB inactive_file:24kB unevictable:1220kB writepending:0kB
present:70732kB managed:49224kB mlocked:0kB bounce:0kB free_pcp:688kB
local_pcp:492kB free_cma:0kB
[  295.998656] lowmem_reserve[]: 0 32
[  295.998659] Normal: 508*4kB (UMEH) 241*8kB (UMEH) 143*16kB (UMEH)
33*32kB (UH) 7*64kB (UH) 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB
0*4096kB = 7752kB

Per above log, the free memory of ~7MB exist in the high atomic reserves
is not freed up before falling back to oom kill path.

Fix it by trying to unreserve the high atomic reserves in
should_reclaim_retry() before __alloc_pages_direct_reclaim() can fallback
to oom kill path.

Bug: 332219324
Link: https://lkml.kernel.org/r/1700823445-27531-1-git-send-email-quic_charante@quicinc.com
Fixes: 0aaa29a56e ("mm, page_alloc: reserve pageblocks for high-order atomic allocations on demand")
(cherry picked from commit ac3f3b0a55518056bc80ed32a41931c99e1f7d81)
Change-Id: I432d4ac4864d401a4413f6b2ef902625766f8070
Signed-off-by: Charan Teja Kalla <quic_charante@quicinc.com>
Reported-by: Chris Goldsworthy <quic_cgoldswo@quicinc.com>
Suggested-by: Michal Hocko <mhocko@suse.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: Chris Goldsworthy <quic_cgoldswo@quicinc.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Pavankumar Kondeti <quic_pkondeti@quicinc.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2024-04-03 22:38:24 +00:00
..
damon Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
kasan Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
kfence mm,kfence: decouple kfence from page granularity mapping judgement 2023-12-03 07:32:08 +01:00
kmsan UPSTREAM: mm: kmsan: handle alloc failures in kmsan_vmap_pages_range_noflush() 2023-05-31 15:20:12 +00:00
backing-dev.c writeback, cgroup: fix null-ptr-deref write in bdi_split_work_to_wbs 2023-04-26 14:28:39 +02:00
balloon_compaction.c mm: Convert all PageMovable users to movable_operations 2022-08-02 12:34:03 -04:00
bootmem_info.c bootmem: remove the vmemmap pages from kmemleak in put_page_bootmem 2022-08-28 14:02:45 -07:00
cleancache.c ANDROID: Revert "mm: remove cleancache" 2023-04-26 17:01:50 +00:00
cma_debug.c mm/cma_debug: show complete cma name in debugfs directories 2022-09-11 20:25:50 -07:00
cma_sysfs.c
cma.c ANDROID: vendor_hooks: Export cma_alloc trace points 2024-03-08 04:04:18 +00:00
cma.h
compaction.c ANDROID: mm: vh for compaction begin/end 2023-10-17 18:15:01 +00:00
debug_page_ref.c
debug_vm_pgtable.c docs: rename Documentation/vm to Documentation/mm 2022-06-27 12:52:53 -07:00
debug.c UPSTREAM: mm: export dump_mm() 2023-06-07 14:24:58 +00:00
dmapool.c
early_ioremap.c
fadvise.c UPSTREAM: mm: support POSIX_FADV_NOREUSE 2023-04-12 16:02:15 +00:00
failslab.c mm: fix unexpected changes to {failslab|fail_page_alloc}.attr 2022-11-22 18:50:44 -08:00
filemap.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
folio-compat.c mm: remove try_to_free_swap() 2022-10-03 14:02:53 -07:00
frontswap.c frontswap: don't call ->init if no ops are registered 2022-09-26 12:14:34 -07:00
gup_test.c mm: rename is_pinnable_page() to is_longterm_pinnable_page() 2022-07-17 17:14:27 -07:00
gup_test.h
gup.c BACKPORT: mm: always expand the stack with the mmap write lock held 2023-07-27 11:47:21 +00:00
highmem.c highmem: fix kmap_to_page() for kmap_local_page() addresses 2022-10-12 18:51:51 -07:00
hmm.c BACKPORT: FROMGIT: mm: enable page walking API to lock vmas during the walk 2023-08-16 16:55:02 +00:00
huge_memory.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
hugetlb_cgroup.c hugetlb_cgroup: use helper for_each_hstate and hstate_index 2022-09-11 20:25:53 -07:00
hugetlb_vmemmap.c mm: hugetlb_vmemmap: fix a race between vmemmap pmd split 2023-09-19 12:27:56 +02:00
hugetlb_vmemmap.h mm: hugetlb_vmemmap: improve hugetlb_vmemmap code readability 2022-08-08 18:06:43 -07:00
hugetlb.c This is the 6.1.68 stable release 2024-01-05 08:40:52 +00:00
hwpoison-inject.c mm/hwpoison: add __init/__exit annotations to module init/exit funcs 2022-10-03 14:03:05 -07:00
init-mm.c UPSTREAM: mm: add per-VMA lock and helper functions to control it 2023-06-07 14:24:59 +00:00
internal.h Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
interval_tree.c
io-mapping.c
ioremap.c mm: ioremap: Add ioremap/iounmap_allowed() 2022-06-27 12:22:31 +01:00
Kconfig BACKPORT: mm: introduce new 'lock_mm_and_find_vma()' page fault helper 2023-07-26 09:57:34 +00:00
Kconfig.debug Merge 6.1.34 into android14-6.1-lts 2023-06-14 19:49:28 +00:00
khugepaged.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
kmemleak.c BACKPORT: mm/kmemleak: fix UAF bug in kmemleak_scan() 2023-05-15 19:08:33 +00:00
ksm.c BACKPORT: FROMGIT: mm: enable page walking API to lock vmas during the walk 2023-08-16 16:55:02 +00:00
list_lru.c mm: kmem: make mem_cgroup_from_obj() vmalloc()-safe 2022-06-16 19:48:31 -07:00
maccess.c mm: Fix copy_from_user_nofault(). 2023-06-28 11:12:17 +02:00
madvise.c Merge 6.1.50 into android14-6.1-lts 2023-09-18 09:52:46 +00:00
Makefile ANDROID: mm: introduce page_pinner 2023-05-16 21:34:27 +00:00
mapping_dirty_helpers.c
memblock.c ANDROID: GKI: Export memblock_free to drivers 2023-03-01 21:29:20 +00:00
memcontrol.c FROMGIT: mm: memcg: don't periodically flush stats when memcg is disabled 2024-01-30 20:40:37 +00:00
memfd.c memfd: check for non-NULL file_seals in memfd_create() syscall 2023-06-28 11:12:27 +02:00
memory_hotplug.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
memory-failure.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
memory-tiers.c memory tier: release the new_memtier in find_create_memory_tier() 2023-03-10 09:34:27 +01:00
memory.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
mempolicy.c Merge 6.1.62 into android14-6.1-lts 2023-11-27 14:58:20 +00:00
mempool.c mm/mempool: use might_alloc() 2022-06-16 19:48:30 -07:00
memremap.c UPSTREAM: mm: introduce __vm_flags_mod and use it in untrack_pfn 2023-06-07 14:24:58 +00:00
memtest.c
migrate_device.c BACKPORT: FROMGIT: mm: enable page walking API to lock vmas during the walk 2023-08-16 16:55:02 +00:00
migrate.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
mincore.c BACKPORT: FROMGIT: mm: enable page walking API to lock vmas during the walk 2023-08-16 16:55:02 +00:00
mlock.c FROMGIT: mm: lock vma explicitly before doing vm_flags_reset and vm_flags_reset_once 2023-08-16 16:55:02 +00:00
mm_init.c mm: multi-gen LRU: groundwork 2022-09-26 19:46:09 -07:00
mm_slot.h mm: introduce common struct mm_slot 2022-10-03 14:02:43 -07:00
mmap_lock.c
mmap.c Merge branch 'android14-6.1' into branch 'android14-6.1-lts' 2024-01-11 08:06:52 +00:00
mmu_gather.c mm/khugepaged: fix GUP-fast interaction by sending IPI 2022-11-30 14:49:42 -08:00
mmu_notifier.c
mmzone.c ANDROID: mm: Create hooks for ZONE_MOVABLE allocs 2023-04-26 17:01:52 +00:00
mprotect.c FROMGIT: mm: lock vma explicitly before doing vm_flags_reset and vm_flags_reset_once 2023-08-16 16:55:02 +00:00
mremap.c UPSTREAM: mm/mremap: write-lock VMA while remapping it to a new address range 2023-06-07 14:25:00 +00:00
msync.c mm/msync: use vma_find() instead of vma linked list 2022-09-26 19:46:25 -07:00
nommu.c BACKPORT: mm: always expand the stack with the mmap write lock held 2023-07-27 11:47:21 +00:00
oom_kill.c FROMGIT: BACKPORT: mm: update mark_victim tracepoints fields 2024-01-19 00:27:34 +00:00
page_alloc.c UPSTREAM: mm: page_alloc: unreserve highatomic page blocks before oom 2024-04-03 22:38:24 +00:00
page_counter.c mm: page_counter: remove unneeded atomic ops for low/min 2022-09-11 20:26:01 -07:00
page_ext.c ANDROID: mm: introduce page_pinner 2023-05-16 21:34:27 +00:00
page_idle.c
page_io.c use less confusing names for iov_iter direction initializers 2023-02-09 11:28:04 +01:00
page_isolation.c BACKPORT: FROMGIT: mm: add alloc_contig_migrate_range allocation statistics 2024-03-13 16:15:27 +00:00
page_owner.c ANDROID: mm: Export page_owner_inited and __set_page_owner 2023-08-29 23:06:13 +00:00
page_pinner.c ANDROID: page_pinner: add missing page_pinner_put_page 2023-05-16 21:34:27 +00:00
page_poison.c
page_reporting.c ANDROID: KVM: arm64: balloon: Notify hyp before reporting free pages to host 2022-12-15 16:13:01 +00:00
page_reporting.h
page_table_check.c mm: page_table_check: Ensure user pages are not slab pages 2023-06-14 11:15:29 +02:00
page_vma_mapped.c mm/swap: add swp_offset_pfn() to fetch PFN from swap entry 2022-09-26 19:46:05 -07:00
page-writeback.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
pagewalk.c BACKPORT: FROMGIT: mm: enable page walking API to lock vmas during the walk 2023-08-16 16:55:02 +00:00
percpu-internal.h
percpu-km.c
percpu-stats.c
percpu-vm.c
percpu.c ANDROID: mm: Export pcpu_nr_pages 2023-03-23 18:20:34 +00:00
pgalloc-track.h
pgtable-generic.c
process_vm_access.c use less confusing names for iov_iter direction initializers 2023-02-09 11:28:04 +01:00
ptdump.c mm: pagewalk: Fix race between unmap and page walker 2022-09-03 10:13:13 -07:00
readahead.c Merge "Merge tag 'android14-6.1.68_r00' into branch 'android14-6.1'" into android14-6.1 2024-01-24 17:34:59 +00:00
rmap.c ANDROID: GKI: export symbols to do reverse mapping within memcg and modify lru stats 2023-09-28 22:13:19 +00:00
rodata_test.c mm/rodata_test: use PAGE_ALIGNED() helper 2022-10-03 14:03:05 -07:00
secretmem.c UPSTREAM: mm: replace vma->vm_flags direct modifications with modifier calls 2023-06-07 14:24:57 +00:00
shmem.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
shrinker_debug.c mm: shrinkers: fix deadlock in shrinker debugfs 2023-02-22 12:59:46 +01:00
shuffle.c mm/shuffle: convert module_param_call to module_param_cb 2022-10-03 14:03:07 -07:00
shuffle.h
slab_common.c ANDROID: vendor_hooks: mm: add hook to count the number pages 2023-11-30 18:19:39 +00:00
slab.c Merge 6.1.22 into android14-6.1 2023-03-31 08:15:39 +00:00
slab.h ANDROID: mm: add get_each_object_track function 2023-03-23 18:21:15 +00:00
slob.c Merge branch 'slab/for-6.1/kmalloc_size_roundup' into slab/for-next 2022-09-29 11:30:55 +02:00
slub.c ANDROID: vendor_hooks: mm: add hook to count the number pages 2023-11-14 23:07:42 +00:00
sparse-vmemmap.c mm: hugetlb_vmemmap: move vmemmap code related to HugeTLB to hugetlb_vmemmap.c 2022-08-08 18:06:42 -07:00
sparse.c mm: memory_hotplug: enumerate all supported section flags 2022-07-03 18:08:49 -07:00
swap_cgroup.c mm: memcontrol: don't allocate cgroup swap arrays when memcg is disabled 2022-10-03 14:03:36 -07:00
swap_slots.c mm/swap: convert put_swap_page() to put_swap_folio() 2022-10-03 14:02:46 -07:00
swap_state.c FROMGIT: swap: remove remnants of polling from read_swap_cache_async 2023-07-19 18:48:39 +00:00
swap.c ANDROID: mm: lru_cache_disable skips lru cache drainnig 2023-12-06 18:54:20 +00:00
swap.h FROMGIT: swap: remove remnants of polling from read_swap_cache_async 2023-07-19 18:48:39 +00:00
swapfile.c ANDROID: vendor hooks: Add hooks to support bootloader based hibernation 2023-06-07 14:25:04 +00:00
truncate.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
usercopy.c mm: Fix copy_from_user_nofault(). 2023-06-28 11:12:17 +02:00
userfaultfd.c mm/shmem: use page_mapping() to detect page cache for uffd continue 2022-11-08 15:57:23 -08:00
util.c Merge tag 'android14-6.1.57_r00' into branch 'android14-6.1' 2023-11-27 16:18:59 +00:00
vmalloc.c This is the 6.1.53 stable release 2023-09-18 09:57:37 +00:00
vmpressure.c net-memcg: Fix scope of sockmem pressure indicators 2023-09-13 09:42:33 +02:00
vmscan.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
vmstat.c UPSTREAM: mm: introduce per-VMA lock statistics 2023-06-07 14:25:01 +00:00
workingset.c Reapply "Merge tag 'android14-6.1.75_r00' into android14-6.1" 2024-04-02 19:49:12 +00:00
z3fold.c mm: Convert all PageMovable users to movable_operations 2022-08-02 12:34:03 -04:00
zbud.c
zpool.c
zsmalloc.c Merge 6.1.47 into android14-6.1-lts 2023-09-13 19:35:46 +00:00
zswap.c zswap: do not shrink if cgroup may not zswap 2023-06-21 16:00:54 +02:00