swap: try to swap memory from the root memcg as much as possible 12/187512/5
authorByungSoo Kim <bs1770.kim@samsung.com>
Wed, 12 Jul 2017 13:22:01 +0000 (22:22 +0900)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Mon, 24 Sep 2018 12:58:34 +0000 (14:58 +0200)
Previous commit "swap: trigger early reclaiming about unused memory of system processes"
introduced early swap about system processes after finishing booting.
But, the root memcg doesn't have much anon usage in memory.stat of cgroup
because most memory has been already migrated to child cgroups.
So, it is no necessary to check anon usage of the root memcg.
But instead, if resourced checks memory.usage_in_bytes of the root memcg,
it can swap memory of system process as much as possible.

Change-Id: I04955b6e486d9cc1167fd8bc58b04287e9774e44
Signed-off-by: ByungSoo Kim <bs1770.kim@samsung.com>
Signed-off-by: Paweł Szewczyk <p.szewczyk@samsung.com>
src/swap/swap.c

index 6012de5..bd5b63e 100644 (file)
@@ -328,9 +328,22 @@ static int swap_use_hard_limit(char *memcg)
 
 static int swap_use_force_reclaim(char *memcg)
 {
-       int ret;
+       int ret, len;
        int try = SWAP_FORCE_RECLAIM_NUM_MAX;
-       unsigned int usage, usage_after_reclaim, nr_to_reclaim;
+       unsigned int usage, nr_to_reclaim;
+       unsigned int total_reclaim = 0;
+       bool root_memcg = false;
+
+       /*
+        * In case of LOWMEM_ROOT_CGROUP,
+        * it is no necessary to check anon usage of memcg
+        * because it doesn't include all memory usage.
+        * But instead, try to swap memory as much as possible.
+        * It will be happend only once after booting done.
+        */
+       len = strlen(memcg);
+       if (!strncmp(memcg, LOWMEM_ROOT_CGROUP, len))
+               root_memcg = true;
 
        do {
                /*
@@ -340,7 +353,11 @@ static int swap_use_force_reclaim(char *memcg)
                 * For this reason it's better to use '.stat' and calculate only
                 * anoynymous memory usage.
                 */
-               ret = memcg_get_anon_usage(memcg, &usage);
+               if (root_memcg)
+                       ret = cgroup_read_node_uint32(memcg, MEMCG_USAGE, &usage);
+               else
+                       ret = memcg_get_anon_usage(memcg, &usage);
+
                if (ret != RESOURCED_ERROR_NONE)
                        usage = 0;
 
@@ -350,23 +367,16 @@ static int swap_use_force_reclaim(char *memcg)
                if (nr_to_reclaim > SWAP_RECLIAM_PAGES_MAX)
                        nr_to_reclaim = SWAP_RECLIAM_PAGES_MAX;
 
+               total_reclaim += nr_to_reclaim;
                ret = cgroup_write_node_uint32(memcg, SWAPCG_RECLAIM,
                        nr_to_reclaim);
                if (ret != RESOURCED_ERROR_NONE)
                        break; /* if we can't reclaim don't continue */
 
-               ret = memcg_get_anon_usage(memcg, &usage_after_reclaim);
-               if (ret != RESOURCED_ERROR_NONE)
-                       usage_after_reclaim = 0;
-
-               if (usage_after_reclaim >= usage)
-                       break; /* if we didn't reclaim more, let's stop */
-
-               _D("FORCE_RECLAIM try: %d, before: %d, after: %d",
-                               try, usage, usage_after_reclaim);
                try -= 1;
        } while (try > 0);
 
+       _D("FORCE_RECLAIM tried %u pages from %s", total_reclaim, memcg);
        return ret;
 }