OSDN Git Service

mm/memcg: simplify mem_cgroup_get_max()
authorWaiman Long <longman@redhat.com>
Tue, 13 Oct 2020 23:52:52 +0000 (16:52 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 14 Oct 2020 01:38:30 +0000 (18:38 -0700)
mem_cgroup_get_max() 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.

[longman@redhat.com: v4]
Link: https://lkml.kernel.org/r/20200914150928.7841-1-longman@redhat.com
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Shakeel Butt <shakeelb@google.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Chris Down <chris@chrisdown.name>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Roman Gushchin <guro@fb.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Yafang Shao <laoar.shao@gmail.com>
Link: https://lkml.kernel.org/r/20200914024452.19167-3-longman@redhat.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/memcontrol.c

index 09e851f..962f8d6 100644 (file)
@@ -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)) {
+                       /* Calculate swap excess capacity from memsw limit */
+                       unsigned long swap = READ_ONCE(memcg->memsw.max) - max;
+
+                       max += min(swap, (unsigned long)total_swap_pages);
+               }
        }
        return max;
 }