From e88ecb4b419b9063e598a165f8a7f28be50b20c7 Mon Sep 17 00:00:00 2001 From: Kaihao Bai Date: Wed, 25 Mar 2026 11:14:36 +0800 Subject: [PATCH] anolis: mm: change the control scope of fast oom ANBZ: #31640 The current interface of fast oom not only restricts global direct memory reclamation, but also restricts memory reclamation at the memcg level and kswapd memory reclamation. For the memcg-level memory reclamation, the difference with memcg-level memory reclamation is that it waits for dirty pages to be written back simultaneously, it might cause deadlock if it holds some file related lock. For the kswapd memory reclamation, the scope of memory reclamation should be minimized to only including direct memory reclamation. Therefore, the restriction on memcg-level memory reclamation needs to be removed in the fast oom interface to avoid potential deadlock if journald writes pages and other tasks wait writeback page flag. Signed-off-by: Kaihao Bai Fixes: c5b9ba93783f ("anolis: mm: support pre oom") --- mm/memcontrol.c | 7 ------- mm/vmscan.c | 3 --- 2 files changed, 10 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a6994003af60..26523e19a89b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -68,7 +68,6 @@ #include #include #include -#include #include "internal.h" #include #include @@ -2671,13 +2670,11 @@ static void reclaim_wmark(struct mem_cgroup *memcg) * simply record the whole duration of reclaim_wmark work for the * overhead-accuracy trade-off. */ - pre_oom_enter(); start = ktime_get_ns(); psi_memstall_enter(&pflags); try_to_free_mem_cgroup_pages(memcg, nr_pages, GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP); psi_memstall_leave(&pflags); duration = ktime_get_ns() - start; - pre_oom_leave(); if (!css_tryget_online(&memcg->css)) return; @@ -2713,13 +2710,11 @@ static unsigned long reclaim_high(struct mem_cgroup *memcg, memcg_memory_event(memcg, MEMCG_HIGH); - pre_oom_enter(); psi_memstall_enter(&pflags); nr_reclaimed += try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, MEMCG_RECLAIM_MAY_SWAP); psi_memstall_leave(&pflags); - pre_oom_leave(); } while ((memcg = parent_mem_cgroup(memcg)) && !mem_cgroup_is_root(memcg)); @@ -3011,14 +3006,12 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, memcg_memory_event(mem_over_limit, MEMCG_MAX); raised_max_event = true; - pre_oom_enter(); memcg_lat_stat_start(&start); psi_memstall_enter(&pflags); nr_reclaimed = try_to_free_mem_cgroup_pages(mem_over_limit, nr_pages, gfp_mask, reclaim_options); psi_memstall_leave(&pflags); memcg_lat_stat_end(MEM_LAT_MEMCG_DIRECT_RECLAIM, start); - pre_oom_leave(); if (mem_cgroup_margin(mem_over_limit) >= nr_pages) goto retry; diff --git a/mm/vmscan.c b/mm/vmscan.c index 3388141a659a..1bf9f16c3b8f 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -60,7 +60,6 @@ #ifdef CONFIG_PAGECACHE_LIMIT #include #endif -#include #include #include @@ -6990,7 +6989,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx) }; set_task_reclaim_state(current, &sc.reclaim_state); - pre_oom_enter(); psi_memstall_enter(&pflags); __fs_reclaim_acquire(_THIS_IP_); @@ -7173,7 +7171,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int highest_zoneidx) snapshot_refaults(NULL, pgdat); __fs_reclaim_release(_THIS_IP_); psi_memstall_leave(&pflags); - pre_oom_leave(); set_task_reclaim_state(current, NULL); /* -- Gitee