On Thu, 30 Jun 2022 08:30:44 +0000 Yosry Ahmed <yosryahmed@xxxxxxxxxx> wrote: > vmpressure is used in cgroup v1 to notify userspace of reclaim > efficiency events, and is also used in both cgroup v1 and v2 as a signal > for memory pressure for networking, see > mem_cgroup_under_socket_pressure(). > > Proactive reclaim intends to probe memcgs for cold memory, without > affecting their performance. Hence, reclaim caused by writing to > memory.reclaim should not trigger vmpressure. > > ... > > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -2319,6 +2319,7 @@ static unsigned long reclaim_high(struct mem_cgroup *memcg, > gfp_t gfp_mask) > { > unsigned long nr_reclaimed = 0; > + unsigned int reclaim_options = MEMCG_RECLAIM_MAY_SWAP; > > do { > unsigned long pflags; > @@ -2331,7 +2332,8 @@ static unsigned long reclaim_high(struct mem_cgroup *memcg, > > psi_memstall_enter(&pflags); > nr_reclaimed += try_to_free_mem_cgroup_pages(memcg, nr_pages, > - gfp_mask, true); > + gfp_mask, > + reclaim_options); It's a bit irksome to create all these unneeded local variables. Why not simply add the constant arg to the try_to_free_mem_cgroup_pages() call? > psi_memstall_leave(&pflags); > } while ((memcg = parent_mem_cgroup(memcg)) && > !mem_cgroup_is_root(memcg)); > @@ -2576,7 +2578,7 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, > struct page_counter *counter; > unsigned long nr_reclaimed; > bool passed_oom = false; > - bool may_swap = true; > + unsigned int reclaim_options = MEMCG_RECLAIM_MAY_SWAP; > bool drained = false; > unsigned long pflags; > > @@ -2593,7 +2595,7 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, > mem_over_limit = mem_cgroup_from_counter(counter, memory); > } else { > mem_over_limit = mem_cgroup_from_counter(counter, memsw); > - may_swap = false; > + reclaim_options &= ~MEMCG_RECLAIM_MAY_SWAP; reclaim_options = 0 would be clearer?