diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 78b18ce5a4fd..1a2fa8c95410 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2362,10 +2362,15 @@ static void reclaim_high(struct mem_cgroup *memcg, gfp_t gfp_mask) { do { + unsigned long pflags; if (page_counter_read(&memcg->memory) <= memcg->high) continue; + memcg_memory_event(memcg, MEMCG_HIGH); + + psi_memstall_enter(&pflags); try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, true); + psi_memstall_leave(&pflags); } while ((memcg = parent_mem_cgroup(memcg))); } @@ -2552,9 +2557,10 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, struct mem_cgroup *mem_over_limit; struct page_counter *counter; unsigned long nr_reclaimed; + enum oom_status oom_status; bool may_swap = true; bool drained = false; - enum oom_status oom_status; + unsigned long pflags; if (mem_cgroup_is_root(memcg)) return 0; @@ -2614,8 +2620,10 @@ retry: memcg_memory_event(mem_over_limit, MEMCG_MAX); + psi_memstall_enter(&pflags); nr_reclaimed = try_to_free_mem_cgroup_pages(mem_over_limit, nr_pages, gfp_mask, may_swap); + psi_memstall_leave(&pflags); if (mem_cgroup_margin(mem_over_limit) >= nr_pages) goto retry; diff --git a/mm/vmscan.c b/mm/vmscan.c index 2f34fc523b20..37775dacd9dc 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -3450,7 +3450,6 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, { struct zonelist *zonelist; unsigned long nr_reclaimed; - unsigned long pflags; int nid; unsigned int noreclaim_flag; struct scan_control sc = { @@ -3477,13 +3476,11 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, trace_mm_vmscan_memcg_reclaim_begin(0, sc.gfp_mask); - psi_memstall_enter(&pflags); noreclaim_flag = memalloc_noreclaim_save(); nr_reclaimed = do_try_to_free_pages(zonelist, &sc); memalloc_noreclaim_restore(noreclaim_flag); - psi_memstall_leave(&pflags); trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed); set_task_reclaim_state(current, NULL);