Message ID | 20200914141955.2145-1-longman@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
On Mon 14-09-20 10:19:55, Waiman Long wrote: > The mem_cgroup_get_max() function used to get memory+swap max from > both the v1 memsw and v2 memory+swap page counters & return the maximum > of these 2 values. This is redundant and it is more efficient to just > get either the v1 or the v2 values depending on which one is currently > in use. > > Signed-off-by: Waiman Long <longman@redhat.com> > --- > mm/memcontrol.c | 24 +++++++++++++----------- > 1 file changed, 13 insertions(+), 11 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 8c74f1200261..2331d4bc7c4d 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -1633,17 +1633,19 @@ void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) > */ > unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg) > { > - unsigned long max; > - > - max = READ_ONCE(memcg->memory.max); > - if (mem_cgroup_swappiness(memcg)) { > - unsigned long memsw_max; > - unsigned long swap_max; > - > - memsw_max = memcg->memsw.max; > - swap_max = READ_ONCE(memcg->swap.max); > - swap_max = min(swap_max, (unsigned long)total_swap_pages); > - max = min(max + swap_max, memsw_max); > + unsigned long max = READ_ONCE(memcg->memory.max); > + > + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) { > + if (mem_cgroup_swappiness(memcg)) > + max += min(READ_ONCE(memcg->swap.max), > + (unsigned long)total_swap_pages); > + } else { /* v1 */ > + if (mem_cgroup_swappiness(memcg)) { > + unsigned long memsw = READ_ONCE(memcg->memsw.max); > + > + if (memsw > max) > + max += min(memsw - max, (unsigned long)total_swap_pages); Yes this looks better. But, memsw can never be smaller than the hard limit (mem_cgroup_resize_max). I would find it slightly easier to understand if you did /* calculate swap excess capacity from memsw limit*/ unsigned long memsw = READ_ONCE(memcg->memsw.max) - max; max += min (memsw, total_swap_pages); > + } > } > return max; > } > -- > 2.18.1
On 9/14/20 10:47 AM, Michal Hocko wrote: > On Mon 14-09-20 10:19:55, Waiman Long wrote: >> The mem_cgroup_get_max() function used to get memory+swap max from >> both the v1 memsw and v2 memory+swap page counters & return the maximum >> of these 2 values. This is redundant and it is more efficient to just >> get either the v1 or the v2 values depending on which one is currently >> in use. >> >> Signed-off-by: Waiman Long <longman@redhat.com> >> --- >> mm/memcontrol.c | 24 +++++++++++++----------- >> 1 file changed, 13 insertions(+), 11 deletions(-) >> >> diff --git a/mm/memcontrol.c b/mm/memcontrol.c >> index 8c74f1200261..2331d4bc7c4d 100644 >> --- a/mm/memcontrol.c >> +++ b/mm/memcontrol.c >> @@ -1633,17 +1633,19 @@ void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) >> */ >> unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg) >> { >> - unsigned long max; >> - >> - max = READ_ONCE(memcg->memory.max); >> - if (mem_cgroup_swappiness(memcg)) { >> - unsigned long memsw_max; >> - unsigned long swap_max; >> - >> - memsw_max = memcg->memsw.max; >> - swap_max = READ_ONCE(memcg->swap.max); >> - swap_max = min(swap_max, (unsigned long)total_swap_pages); >> - max = min(max + swap_max, memsw_max); >> + unsigned long max = READ_ONCE(memcg->memory.max); >> + >> + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) { >> + if (mem_cgroup_swappiness(memcg)) >> + max += min(READ_ONCE(memcg->swap.max), >> + (unsigned long)total_swap_pages); >> + } else { /* v1 */ >> + if (mem_cgroup_swappiness(memcg)) { >> + unsigned long memsw = READ_ONCE(memcg->memsw.max); >> + >> + if (memsw > max) >> + max += min(memsw - max, (unsigned long)total_swap_pages); > Yes this looks better. But, memsw can never be smaller than the hard > limit (mem_cgroup_resize_max). I would find it slightly easier to > understand if you did > /* calculate swap excess capacity from memsw limit*/ > unsigned long memsw = READ_ONCE(memcg->memsw.max) - max; > max += min (memsw, total_swap_pages); Right, I thought it was possible to set memsw lower than mem. It was not allowed. So the extra check is unnecessary. Will fix that. Cheers, Longman
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8c74f1200261..2331d4bc7c4d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1633,17 +1633,19 @@ void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) */ unsigned long mem_cgroup_get_max(struct mem_cgroup *memcg) { - unsigned long max; - - max = READ_ONCE(memcg->memory.max); - if (mem_cgroup_swappiness(memcg)) { - unsigned long memsw_max; - unsigned long swap_max; - - memsw_max = memcg->memsw.max; - swap_max = READ_ONCE(memcg->swap.max); - swap_max = min(swap_max, (unsigned long)total_swap_pages); - max = min(max + swap_max, memsw_max); + unsigned long max = READ_ONCE(memcg->memory.max); + + if (cgroup_subsys_on_dfl(memory_cgrp_subsys)) { + if (mem_cgroup_swappiness(memcg)) + max += min(READ_ONCE(memcg->swap.max), + (unsigned long)total_swap_pages); + } else { /* v1 */ + if (mem_cgroup_swappiness(memcg)) { + unsigned long memsw = READ_ONCE(memcg->memsw.max); + + if (memsw > max) + max += min(memsw - max, (unsigned long)total_swap_pages); + } } return max; }
The mem_cgroup_get_max() function used to get memory+swap max from both the v1 memsw and v2 memory+swap page counters & return the maximum of these 2 values. This is redundant and it is more efficient to just get either the v1 or the v2 values depending on which one is currently in use. Signed-off-by: Waiman Long <longman@redhat.com> --- mm/memcontrol.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)