lkml.org 
[lkml]   [2022]   [Jul]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Date
SubjectRe: [PATCH v3] mm: vmpressure: don't count proactive reclaim in vmpressure
On Fri, Jul 1, 2022 at 4:09 PM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Thu, 30 Jun 2022 08:30:44 +0000 Yosry Ahmed <yosryahmed@google.com> 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.

\
 
 \ /
  Last update: 2022-07-06 22:21    [W:0.086 / U:1.068 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site