The commit is pushed to "branch-rh7-3.10.0-693.11.6.vz7.42.x-ovz" and will 
appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.11.6.vz7.42.4
------>
commit 8b765718160bb021385259eb3feeae758f241487
Author: Yu Zhao <yuz...@google.com>
Date:   Wed Jan 31 18:48:03 2018 +0300

    ms/memcg: refactor mem_cgroup_resize_limit()
    
    mem_cgroup_resize_limit() and mem_cgroup_resize_memsw_limit() have
    identical logics.  Refactor code so we don't need to keep two pieces of
    code that does same thing.
    
    Link: http://lkml.kernel.org/r/20180108224238.14583-1-yuz...@google.com
    Signed-off-by: Yu Zhao <yuz...@google.com>
    Acked-by: Vladimir Davydov <vdavydov....@gmail.com>
    Acked-by: Michal Hocko <mho...@suse.com>
    Cc: Johannes Weiner <han...@cmpxchg.org>
    Signed-off-by: Andrew Morton <a...@linux-foundation.org>
    
    https://jira.sw.ru/browse/PSBM-80732
    Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com>
---
 mm/memcontrol.c | 89 +++++++++++++++------------------------------------------
 1 file changed, 23 insertions(+), 66 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 8a46ce2483a3..22471a7b995a 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3800,13 +3800,15 @@ void mem_cgroup_print_bad_page(struct page *page)
 #endif
 
 static int mem_cgroup_resize_limit(struct mem_cgroup *memcg,
-                                  unsigned long limit)
+                                  unsigned long limit, bool memsw)
 {
        unsigned long curusage;
        unsigned long oldusage;
        bool enlarge = false;
        int retry_count;
        int ret;
+       bool limits_invariant;
+       struct page_counter *counter = memsw ? &memcg->memsw : &memcg->memory;
 
        /*
         * For keeping hierarchical_reclaim simple, how long we should retry
@@ -3816,7 +3818,7 @@ static int mem_cgroup_resize_limit(struct mem_cgroup 
*memcg,
        retry_count = MEM_CGROUP_RECLAIM_RETRIES *
                      mem_cgroup_count_children(memcg);
 
-       oldusage = page_counter_read(&memcg->memory);
+       oldusage = page_counter_read(counter);
 
        do {
                if (signal_pending(current)) {
@@ -3824,22 +3826,29 @@ static int mem_cgroup_resize_limit(struct mem_cgroup 
*memcg,
                        break;
                }
                mutex_lock(&memcg_limit_mutex);
-               if (limit > memcg->memsw.limit) {
+               /*
+                * Make sure that the new limit (memsw or memory limit) doesn't
+                * break our basic invariant rule memory.limit <= memsw.limit.
+                */
+               limits_invariant = memsw ? limit >= memcg->memory.limit :
+                                          limit <= memcg->memsw.limit;
+               if (!limits_invariant) {
                        mutex_unlock(&memcg_limit_mutex);
                        ret = -EINVAL;
                        break;
                }
-               if (limit > memcg->memory.limit)
+               if (limit > counter->limit)
                        enlarge = true;
-               ret = page_counter_limit(&memcg->memory, limit);
+               ret = page_counter_limit(counter, limit);
                mutex_unlock(&memcg_limit_mutex);
 
                if (!ret)
                        break;
 
-               try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, 0);
+               try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL,
+                                       memsw ? MEM_CGROUP_RECLAIM_NOSWAP : 0);
 
-               curusage = page_counter_read(&memcg->memory);
+               curusage = page_counter_read(counter);
                /* Usage is reduced ? */
                if (curusage >= oldusage)
                        retry_count--;
@@ -3853,58 +3862,6 @@ static int mem_cgroup_resize_limit(struct mem_cgroup 
*memcg,
        return ret;
 }
 
-static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg,
-                                        unsigned long limit)
-{
-       unsigned long curusage;
-       unsigned long oldusage;
-       bool enlarge = false;
-       int retry_count;
-       int ret;
-
-       /* see mem_cgroup_resize_res_limit */
-       retry_count = MEM_CGROUP_RECLAIM_RETRIES *
-                     mem_cgroup_count_children(memcg);
-
-       oldusage = page_counter_read(&memcg->memsw);
-
-       do {
-               if (signal_pending(current)) {
-                       ret = -EINTR;
-                       break;
-               }
-
-               mutex_lock(&memcg_limit_mutex);
-               if (limit < memcg->memory.limit) {
-                       mutex_unlock(&memcg_limit_mutex);
-                       ret = -EINVAL;
-                       break;
-               }
-
-               if (limit > memcg->memsw.limit)
-                       enlarge = true;
-               ret = page_counter_limit(&memcg->memsw, limit);
-               mutex_unlock(&memcg_limit_mutex);
-
-               if (!ret)
-                       break;
-
-               try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL,
-                                       MEM_CGROUP_RECLAIM_NOSWAP);
-
-               curusage = page_counter_read(&memcg->memsw);
-               /* Usage is reduced ? */
-               if (curusage >= oldusage)
-                       retry_count--;
-               else
-                       oldusage = curusage;
-       } while (retry_count);
-
-       if (!ret && enlarge)
-               memcg_oom_recover(memcg);
-       return ret;
-}
-
 unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,
                                            gfp_t gfp_mask,
                                            unsigned long *total_scanned)
@@ -4564,10 +4521,10 @@ static int mem_cgroup_write(struct cgroup *cont, struct 
cftype *cft,
                }
                switch (MEMFILE_TYPE(cft->private)) {
                case _MEM:
-                       ret = mem_cgroup_resize_limit(memcg, nr_pages);
+                       ret = mem_cgroup_resize_limit(memcg, nr_pages, false);
                        break;
                case _MEMSWAP:
-                       ret = mem_cgroup_resize_memsw_limit(memcg, nr_pages);
+                       ret = mem_cgroup_resize_limit(memcg, nr_pages, true);
                        break;
                case _KMEM:
                        ret = memcg_update_kmem_limit(memcg, nr_pages);
@@ -4873,10 +4830,10 @@ int mem_cgroup_apply_beancounter(struct mem_cgroup 
*memcg,
 
        /* try change mem+swap before changing mem limit */
        if (memcg->memsw.limit != memsw)
-               (void)mem_cgroup_resize_memsw_limit(memcg, memsw);
+               (void)mem_cgroup_resize_limit(memcg, memsw, true);
 
        if (memcg->memory.limit != mem) {
-               ret = mem_cgroup_resize_limit(memcg, mem);
+               ret = mem_cgroup_resize_limit(memcg, mem, false);
                if (ret)
                        goto out;
        }
@@ -4888,17 +4845,17 @@ int mem_cgroup_apply_beancounter(struct mem_cgroup 
*memcg,
                /* first, reset memsw limit since it cannot be < mem limit */
                if (memsw_old < PAGE_COUNTER_MAX) {
                        memsw_old = PAGE_COUNTER_MAX;
-                       ret = mem_cgroup_resize_memsw_limit(memcg, memsw_old);
+                       ret = mem_cgroup_resize_limit(memcg, memsw_old, true);
                        if (ret)
                                goto out;
                }
-               ret = mem_cgroup_resize_limit(memcg, mem);
+               ret = mem_cgroup_resize_limit(memcg, mem, false);
                if (ret)
                        goto out;
        }
 
        if (memsw != memsw_old) {
-               ret = mem_cgroup_resize_memsw_limit(memcg, memsw);
+               ret = mem_cgroup_resize_limit(memcg, memsw, true);
                if (ret)
                        goto out;
        }
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to