On Fri, Jul 1, 2022 at 4:09 PM Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > > 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? > I was trying to improve readability by trying to have consistent reclaim_options local variable passed into try_to_free_mem_cgroup_pages(), and also to avoid nested line-wrapping in cases where reclaim_options = MEMCG_RECLAIM_MAY_SWAP | MEMCG_RECLAIM_PROACTIVE (like in memory_reclaim()). Since you found it irksome, I obviously failed :) Will remove the local variables where possible and send a v4. Thanks for taking a look! > > 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? > I feel like the current code is more clear to the reader and future-proof. If we can't swap, we want to remove the MAY_SWAP flag, we don't want to remove all existing flags. In this case it's the same, but maybe in the future it won't be and someone will miss updating this line. Anyway, I don't have a strong opinion, let me know what you prefer for v4.